うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【C#】現在の git ブランチ名を取得する

git のブランチ名を取得する方法でパッと思いつくのは、 C# からターミナルを利用してコマンドを叩きブランチ名を取得する方法だと思います

この方法ではOSごとに違う処理を書く必要があり結構面倒です

しかし、現在のブランチ名は .git ディレクトリ内部にあるファイルを見ることで知ることができます

.git/HEAD

それは HEAD というファイルで中身は以下のようになっています

ref: refs/heads/develop

見て分かる通り現在は develop ブランチにいることが分かります

例えば master に切り替えた場合は

ref: refs/heads/master

直接ハッシュに切り替えた場合はそのハッシュ値になります

8bdf4f7f8c661b07c4b4a1bb5a303bf2ea34d1e5

これを利用して現在のブランチ名を取得します

コード

public static string GetBranchName()
{
    var gitDirPath = string.Empty;
    var path = Application.dataPath;
    // 3ディレクトリたどって無ければ諦める
    for (var i = 0; i < 3; i++)
    {
        var dirs = System.IO.Directory.GetDirectories(path, ".git");
        if (dirs.Length > 0)
        {
            gitDirPath = dirs[0];
            break;
        }
        // ディレクトリを一つ上げる
        path = System.IO.Path.GetDirectoryName(path);
    }
 
    if (string.IsNullOrEmpty(gitDirPath))
        return string.Empty;
 
    var headPath = gitDirPath + "/HEAD";
    var refs = string.Empty;
    using (var reader = new System.IO.StreamReader(headPath))
        refs = reader.ReadLine();
 
    // ref: refs/heads/ で始まっていない場合はハッシュチェックアウト
    if (!refs.StartsWith("ref: refs/heads/"))
        return string.Empty;
 
    var branch = refs.Substring("ref: refs/heads/".Length);
    return branch;
}

サンプル

f:id:hacchi_man:20200311001023p:plain

public class SampleEditorWindow : EditorWindow
{

    private string _branch;

    private void OnGUI()
    {
        if (GUILayout.Button("Update Branch"))
        {
            _branch = GetBranchName();
        }
        EditorGUILayout.LabelField(_branch);
    }
}