git設定は複数のリポジトリに設定できますか?


18

Gitは3つのレベルで設定値をサポートしているようです:

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

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

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


私の最初の反射は、スクリプトをハックして、作成する.gitconfig各ディレクトリを微調整することです。たとえば、IIRC Androidのレポはこれを行うことができますが、調べるにはソースを注意深く読む必要があります。(私は完全に確認してください、私はしばらくの間であることを行っていないではないよ。)
ジル「SO-ストップが悪さ」

@Gilles:それは確かに可能性です。問題のリポジトリは、最近CVSからGitに移行したLinuxディストリビューションのパッケージリポジトリです。すべてのツールのやり直しに取り組んでいます。長期的にはおそらくこれが修正されるでしょうが、短期的には作業している私たちはオプションが何であるかを実験しています。
カレブ

回答:


11

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

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

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

私はcommand git -c user.email=alternate@credentials.org user.name="Alter Ego" "$@"それを行うことができますか、それについてどうすればいいですか?高い値と低い値を検索し、この-cフラグへの唯一の参照はあなたのものでした、ありがとう、大いに感謝します。
ヴィックゴールドフェルド

記録のために、私はでの作業それを得たcommand git -c user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
ヴィックGoldfeld

6

環境変数を使用してgitの電子メールアドレスを構成できますGIT_AUTHOR_EMAIL。これを組み合わせている場合、ディレクトリに入るでbashスクリプトを実行するのzshでディレクトリの特定のシェル設定を使用すると、中のディレクトリに入力した場合は、簡単にディレクトリまたは親ディレクトリ、例えばごとに設定を変更することができ~/work、自動的にあなたのメールアドレスを変更するために、環境変数を調整することができます住所。


2

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

http://gik.firetrot.com/index.php/2018/05/06/git-configuration-across-multiple-repositories/

「〜/ .gitconfig」ファイルに追加します。

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

コンテンツを含む「〜/ .gitconfig-project1」ファイルを作成します。

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  

    [user]  
      name = user1  
      email = user1@email.com  

"includeIf"述語は頭痛を軽減します!
Truong Nguyen

1

Calebの答えに基づいてgit、このディレクトリ内のすべてのリポジトリを恒久的に正しく構成する変更されたコマンドを定義して、vanilla 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 configを正しく読み取る他のgitフロントエンドにも影響します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.