1. ホーム
  2. git

[解決済み] すべての子フォルダに対して git の設定値を設定する

2022-11-04 22:51:40

質問

私は、ユーザーレベルの設定を上書きするレポ単位の設定を行うことが可能であることを知っています (すなわち /path/to/my/repo/.gitconfig を上書きする ~/.gitconfig ). あるフォルダのすべての子フォルダに対して、ユーザーレベルの設定をオーバーライドするようなgit configsを設定することは可能でしょうか?例えば、私は

|--topLevelFolder1
|--\
|   ---.gitconfig_override
|--\
|   ---childFolder1
|       \---[...]
|--\
|   ---childFolder2
|       \---[...]

で定義された設定を .gitconfig_override で定義された設定を childFolder1childFolder2 .

私の動機は次のとおりです。私は仕事用のラップトップを持っていますが、空き時間には個人的なプロジェクトにも使用しています。私の仕事のコードはすべて 1 つのフォルダー内にネストされています。私が仕事の git リポジトリにプッシュするとき、私は仕事のペルソナ (名前の代わりに仕事のログイン、および仕事の電子メール) を使用してプッシュする必要があります。私自身の個人的な(github)リポジトリにプッシュするときは、私の本名と個人の電子メールで行いたいと思います。

私が考えた他の可能な解決策 (および問題点)。

  • 仕事用と遊び用に別々のユーザーを作成し、それぞれのユーザー レベルの設定を適切に行い、コンテキストを切り替えるときに適切なユーザーとしてログインする (面倒ですが、切り替えるのを簡単に忘れてしまいます)。
  • workFolder" 内の git リポジトリを検索し、適切な詳細を保持するためにそれらの .gitconfig ファイルを追加/更新するスクリプトを作成する (リポジトリを作成し、プッシュする前にスクリプトを実行することを忘れた場合、間違った人としてプッシュすることになります)。
  • git がレポを作成するたびにファイルパスをチェックし、適切であれば .gitconfig ファイルを更新するように "hack" する (複雑で面倒、そしてほぼ確実に間違った方法 - 加えて、私にはどうすればいいか最初の手がかりもありません!)。

私は この質問 を確認しましたが、複数のレポではなく、単一のレポのための解決策しか含まれていないようです。願わくば、この質問を見逃した人が見てくれることを祈ります。

どのように解決するのですか?

によって述べられたように NateEagの編集 , git の 条件付きインクルード はこれに最適です。この回答は git < 2.13 を使っている人向けのものなので、より新しいバージョンを使っている人向けのものを紹介します。

まず、サブフォルダに反映させたい設定を記述した新しい設定ファイルをどこかに作成します。元の質問のフォルダーを参考にすると ~/topLevelFolder1/.gitconfig_include

~/.gitconfig に、追加します。

[includeIf "gitdir:~/toplevelFolder1/"]
    path = ~/topLevelFolder1/.gitconfig_include

の任意のサブフォルダ ~/topLevelFolder1 のサブフォルダには ~/toplevelFolder1/.gitconfig_include - を手動で変更する必要はありません。 .git/config を手動で変更する必要はありません。(これは を上書きするわけではありません。 サブフォルダ設定にあるものを上書きするのではなく、単に を追加します。 を追加するだけです("include" が意味するように)。

注意事項

  • この設定は の後にあります。 で上書きしたい設定を ~/.gitconfig というのも includeIf はその後に続くすべての設定によって再び上書きされるからです。
  • この設定は、以下の場合にのみファイルを含めます。 リポジトリにある にいる場合のみです。リポジトリ以外のサブパスにいる場合は無視されます。
  • 末尾のフォワードスラッシュ ( / ) を含む gitdir の条件が重要です。
  • git config --list はこれをテストするのに適しています。以下にオーバーライドがあることがわかるでしょう。 includeIf の行の下にあるオーバーライドが出力されます。また、特定のエントリーをチェックするには、例えば git config --get user.email
  • Windows版Git では、ユーザーディレクトリからの相対パスを ~/ で相対パスを、Windows 形式のドライブで絶対パスを指定します。 C:/ のように、フォワードスラッシュのみを使用した絶対パスを指定します。バックスラッシュとUnixスタイルのマウントポイントである /c/ のようなバックスラッシュやUnixスタイルのマウントポイントは機能しません。さらに includeIf の部分では、比較のために正しい大文字と小文字のパスを指定する必要があります。 大文字小文字を区別します。 .