git 設定を複数のリポジトリにわたって設定できますか?

git 設定を複数のリポジトリにわたって設定できますか?

Git は次の 3 つのレベルで構成値をサポートしているようです。

  • システムごとのグローバル設定( に保存/etc/git-core
  • ユーザーごとのグローバル設定( に保存~/.gitconfig
  • リポジトリごとのローカル設定( に保存$REPO/.git/config

これらのオプションは、ほとんどの基本をカバーしていますが、私は 4 番目のレベルを処理する方法を探しています。私は (非常に) 大規模なリポジトリ コレクションを持っており、それらには、user.email通常とは異なる値を使用する必要があります。これらのリポジトリは、多くの場合、自動化されたスクリプトによって作成および操作され、リポジトリごとにローカル設定を設定するのは面倒です。

問題となっているリポジトリはすべて、ローカル システム上の特定のパス プレフィックスの下にあります。そのパスの下にあるすべてのリポジトリに継承される構成値をどこかに設定する方法はありますか? (.htaccess設定がファイル システム全体に継承されるようなものです)。おそらく、グローバル構成ファイルに条件値を設定する方法があるでしょうか? 私のようなリポジトリのセットに対処するために、UNIX 環境で他にどのような調整を行えるでしょうか?

答え1

この第 4 レベルで git を構成する方法が見つかりませんでした。 唯一の方法は、 を使用してコマンドごとに構成値をオーバーライドすることのようですgit -c key=value

私が現在行っているハッキーな解決策は、git のラッパーとして機能するシェル関数を定義することです。呼び出されると、引数がシステムの git コマンドに渡されますが、その前に現在の作業ディレクトリをチェックし、該当する場合はコマンドに追加の引数を追加します。

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c [email protected] "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

答え2

Git 構成に基づくこのソリューションを参照してください。

https://dzone.com/articles/how-to-use-gitconfigs-includeif

「~/.gitconfig」ファイルに追加:

    [includeIf "gitdir:~/work/project1/.git"]  
      path = .gitconfig-project1  

以下の内容の「~/.gitconfig-project1」ファイルを作成します。

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  
  
    [user]  
      name = user1  
      email = [email protected]  

答え3

環境変数でgitのメールアドレスを設定できますGIT_AUTHOR_EMAIL。これをディレクトリに入るときにbashスクリプトを実行するまたはzsh によるディレクトリ固有のシェル設定ディレクトリまたは親ディレクトリごとに設定を簡単に変更できます。たとえば、ディレクトリに入ると、~/work環境変数を自動的に調整して電子メール アドレスを変更できます。

答え4

Caleb の回答に基づいて、gitこのディレクトリ内のすべてのリポジトリを永続的に正しく構成する修正されたコマンドを定義できます。これにより、今後のすべての vanilla git の使用で新しい構成が使用されるようになります。私は を使用しますhub。これは別の git ラッパーであるため、 をこれに置き換えてalias git=hubhub関数で を呼び出しました。 を使用しない場合はhub、すべてのhub呼び出しを に置き換えますcommand git

function git() {
    case "$PWD" in
        /home/robin/git/3RD_PARTY)
            hub "$@"
            # We don't know which repository was cloned / operated on, so let's just reconfigure them all
            for f in *; do
                [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
            done
            ;;
        /home/robin/git/3RD_PARTY/*)
            hub "$@"
            hub config user.email $my_private_email
            ;;
        *)
            hub "$@"
            ;;
    esac
}

シェルでのみ機能する (明示的にソースを指定しない限り、対話型シェルでのみ機能する) Caleb の回答とは異なり、これは、emacs magit など、git 構成を正しく読み取る他の git フロントエンドにも影響します。

関連情報