複数のリポジトリにわたって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このディレクトリ内のすべてのリポジトリを恒久的に正しく設定する修正されたコマンドを定義することで、バニラgitを使用するすべてのリポジトリに新しい設定を使用させることができます。私はhub別のgitラッパーであるので、alias git=hub私をそれに置き換えてhub関数から呼び出しました。を使用しない場合は、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フロントエンドにも影響します。

関連情報