20200805のGitに関する記事は3件です。

UnityのC#からGitを叩く

UnityのC#からGitを叩く

UnityのC#のEditor拡張スクリプトからGitコマンドを叩く機会があったので、忘れないうちにまとめます。

サンプルコマンド

今回、例として、UnityのC#から以下のコマンドを叩いてみます。

git config core.autocrlf

改行コードを自動で変換する機能が有効になっているか確認できるコマンドです。

サンプルコード

以下がサンプルコードです。外部から GetAutocrlf を叩けばコマンドが実行されます。

using System;
using System.Diagnostics;
using System.IO;
using UnityEditor;
using UnityEngine;
using Debug = UnityEngine.Debug;

public class GitCommandPractice
{
    /// <summary>
    /// Gitのautocrlfを確認する。
    /// </summary>
    public void GetAutocrlf()
    {
        // gitのパスを取得する。
        string gitPath = GetGitPath();

        // gitのコマンドを設定する。
        string gitCommand = "config core.autocrlf";

        // コマンドを実行して標準出力を取得する。
        string autocrlf = GetStandardOutputFromProcess(gitPath, gitCommand).Trim();

        Debug.Log(autocrlf);
    }

    /// <summary>
    /// Gitの実行ファイルのパスを取得する。
    /// </summary>
    /// <returns>Gitのパス</returns>
    private string GetGitPath()
    {
        // Macのとき
        if (Application.platform == RuntimePlatform.OSXEditor)
        {
            // パスの候補
            string[] exePaths =
            {
                "/usr/local/bin/git",
                "/usr/bin/git"
            };

            // 存在するパスで最初に見つかったもの
            return exePaths.FirstOrDefault(exePath => File.Exists(exePath));
        }

        // Windowsはこれだけで十分
        return "git";
    }

    /// <summary>
    /// コマンドを実行して標準出力を取得する。
    /// </summary>
    /// <param name="exePath">実行ファイルのパス</param>
    /// <param name="arguments">コマンドライン引数</param>
    /// <returns>標準出力</returns>
    private string GetStandardOutputFromProcess(string exePath, string arguments)
    {
        // プロセスの起動条件を設定する。
        ProcessStartInfo startInfo = new ProcessStartInfo()
        {
            FileName = exePath,
            Arguments = arguments,
            WindowStyle = ProcessWindowStyle.Hidden,
            UseShellExecute = false,
            RedirectStandardOutput = true,
        };

        // プロセスを起動する。
        using (Process process = Process.Start(startInfo))
        {
            // 標準出力を取得する。
            string output = process.StandardOutput.ReadToEnd();

            // プロセスが終了するかタイムアウトするまで待つ。
            process.WaitForExit(TimeoutPeriod);

            return output;
        }
    }
}

解説

C# の Prosess を使って、Gitコマンドを叩き、その標準出力を読み取るという仕組みです。

GetGitPath() では、Gitの実行ファイルのパスを取得しています。

Gitの実行ファイルのパスは、環境変数Pathに登録されていることが一般的だと思うので、単に git と記述してもほとんどの場合、問題ないと思います。

ただし、私のMac環境ではそれではうまく行かなかったので、 /usr/local/bin/gitusr/bin/git の2種類を明示的にハードコーディングし、どちらか見つかった方を実行ファイルとして利用するようにしました。

さいごに

本記事作成にあたり、以下を参考にしました。ありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ssh接続で`load pubkey "~/.ssh/KEYNAME": invalid format`というエラーが出る

MacOSでgithubへ接続する際、毎回パスワードを聞かれるので

https://qiita.com/rorensu2236/items/df7d4c2cf621eeddd468

を参考にssh接続するようにしたが、接続するたびに

$ git fetch
load pubkey "/Users/kanada/.ssh/KEYNAME": invalid format

というWarningが表示されるようになってしまった(認証自体は成功しているし、gitコマンドも使用できている)。

https://bbs.archlinux.org/viewtopic.php?pid=1909206#p1909206

を参考に、~/.ssh/KEYNAMEに対応する公開鍵を、

~/.ssh/KEYNAME.pub

という名前で保存することでWarningを消すことができた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VSCodeの「format on save」を統一していなかったばかりにマージの手間が増えたよって話

概要

社内で、とあるプロジェクトのソースをマージしようとした時の話です。
やけに差分が多いなと思っていると、どうやらロジック自体に変更はなく、コードに整形がかかってたり、いなかったりしている様子。
そういえばマージリクエストを出してくれてるのは今週から入ったメンバーだな、と思い問い合わせてみると・・・

なにが起きたか

開発者によってVSCodeの拡張機能や設定が異なり、特にPrettier等のコードフォーマッター周りの設定が異なると、各自が修正したかった箇所以外にも整形がかかる(もしくはかからない)状態となっていました。
結果的にマージ時に、意図しない差分が発生してなかなかに手間になっていました。

実例として、自分が遭遇したのは下記の例です。

format on saveが有効/無効になっている

format on saveCtrl + Sで保存した際にコードフォーマットをする/しないの設定です。
これが開発チーム内で統一されていれば良かったのですが、今回はされていませんでした。

format on saveの確認方法はVSCodeの【設定】から検索するか、Settings.jsonに下記の記載があるかで参照できます。

{
    "editor.formatOnSave": true
}

まとめ

すぐに原因が分かったため、チーム内であらためてformat on saveをはじめとするVSCodeの設定について共有しました。
余談ですが、複数プロジェクトにまたがってアサインしている場合は、プロジェクト毎に開発規約が異なり、整形ルールも変わってくると思うのでformat on save等はワークスペースの設定に持っていくことをお勧めします。
そのあたりは下記記事が詳しいです。

備考

個人ブログの方にも同様の記事を掲載してあります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む