プロジェクトごとに異なるGit構成を使用することはできますか?


315

.gitconfig通常はuser.homeディレクトリに格納されます。

私は、会社Aのプロジェクトと会社Bのその他のプロジェクト(主に名前/電子メール)に別のIDを使用しています。2つの異なるGit構成を使用して、チェックインが名前/電子メールで実行されないようにするにはどうすればよいですか?

回答:


264

.git/configリポジトリの特定のクローン内のファイルは、そのクローンに対してローカルです。そこに配置された設定は、その特定のプロジェクトのアクションにのみ影響します。

(デフォルトでgit config.git/config、は変更されますが、変更されないのは後者~/.gitconfigのみ--globalです。)


それで、[user] email = ...ブロックを変更するなど、リポジトリ自体の構成内の構成ファイルを変更すると、グローバルが上書きされます~/.gitconfig-これはユーザー専用です?
dcsan

284

git configには3つのレベルがあります。プロジェクト、グローバル、システム。

  • project:プロジェクト構成は現在のプロジェクトでのみ使用でき、プロジェクトのディレクトリの.git / configに保存されます。
  • global:グローバル構成は、現在のユーザーのすべてのプロジェクトで使用でき、〜/ .gitconfigに保存されます。
  • system:システム構成はすべてのユーザー/プロジェクトで利用でき、/ etc / gitconfigに保存されます。

プロジェクト固有の設定を作成します。これをプロジェクトのディレクトリの下で実行する必要があります。

$ git config user.name "John Doe" 

グローバル構成を作成します。

$ git config --global user.name "John Doe"

システム構成を作成します。

$ git config --system user.name "John Doe" 

そして、ご想像のとおり、プロジェクトはグローバルおよびグローバルオーバーライドシステムをオーバーライドします。


69
「ディレクトリ」構成を作成する可能性はありますか?私は自宅で仕事をしていて、仕事用のプロジェクトと自分のフォルダを持っています。だから私はgit reposで〜/ jobと〜/ myのフォルダーを取得し、それらの下のプロジェクトに異なる設定が必要です。たとえば、job / project1にはjob / .gitconfigからの設定があります。
セルジュ

2
@Sergeは、ディレクトリレベルの構成を作成できるかどうか考えたことはありますか?私は今、同じ問題を抱えています。
質問

2
いいえ、システム全体の構成を個人データに設定し、bashスクリプトを作成して、ジョブデータを特定のプロジェクト構成に1つのコマンドで設定します。
セルジュ、

1
付録として:ちょうどgit config user.nameまたはgit config user.emailあなたのGitが現在のレポジトリに使用する名前または電子メールが表示されます。
Abhishek Divekar

1
私は結局これをzshのためにやってしまいました:gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106、これが誰かに役立つことを願っています。
pgarciacamou

219

gitバージョン2.13以降、gitはを含む条件付き構成をサポートしています。この例では、会社Aのリポジトリを~/company_aディレクトリに複製し、会社Bのリポジトリをに複製し~/company_bます。

あなたの中に.gitconfigあなたはこのようなものを置くことができます。

[includeIf "gitdir:~/company_a/"]
  path = .gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
  path = .gitconfig-company_b

.gitconfig-company_aの内容の例

[user]
name = John Smith
email = john.smith@companya.net

.gitconfig-company_bの内容の例

[user]
name = John Smith
email = js@companyb.com

1
これがバージョン2.13で追加されたのは素晴らしいことです。私はしばらくgithub.com/bddenhartog/git-profilesを使用していますが、Towerで動作させることができませんでした。
ドラム

4
includeIfは少し気難しいです、以下を参照してくださいstackoverflow.com/questions/43919191/...を
ルーブル

リンク先のドキュメントページでこのことについて言及されていません...実際、includeIfを検索してもドキュメントに結果はありません
Thomas Levesque

1
@ThomasLevesqueそれは変だ。前にも言っていたと思います。あなたは変更履歴でそれを見つけることができますgithub.com/git/git/blob/master/Documentation/RelNotes/...でも超えるとkernel.org/pub/software/scm/git/docs/git-config.html
crea1

2
@JosephLust git> = 2.13 (Ubuntu 16.04にはgit 2.7)をインストールする必要があります。Git PPA経由でgitの最新バージョンを入手してください。それは機能します:)
Cas

24

ありがとう@ crea1

小さな変種:

https://git-scm.com/docs/git-config#_includesに書かれているので:

パターンがで終わっている場合/**自動的に追加されます。たとえば、パターンはにfoo/なりfoo/**ます。つまりfoo、再帰的に、すべての内部と一致します。

だから私は私の場合、
〜/ .gitconfigを使用します

[user] # as default, personal needs
    email = myalias@personal-domain.fr
    name = bcag2
[includeIf "gitdir:~/workspace/"] # job needs, like workspace/* so all included projects
    path = .gitconfig-job

# all others section: core, alias, log…

したがって、プロジェクトディレクトリがmy ~/wokspace/にある場合、デフォルトのユーザー設定は
〜/ .gitconfig-wに置き換えられます。

[user]
name = John Smith
email = js@company.com

これで、正しいユーザー名と電子メールが別のディレクトリに設定されました。git config user.name / git config user.emailを実行すると、正しい詳細が表示されます。しかし、個人用リポジトリでコメントすると、常にグローバルな公式ユーザー名のメールが表示されます
Bhupendra

@Bhupendra私のサンプルでは、​​.gitconfigと.gitconfig-jobはプロジェクトディレクトリではなく、私の家にあります。2つ以上必要ですか?私のサンプルの.gitconfig-jobとして、3行でホームディレクトリに.gitconfig-alternativを作成してもらいます。
bcag2

@ bcag2私も上記と同じ例に従いました。私は2つの構成をデフォルトで動作させ、gitconfig-jobと同様に個人的な動作をさせます。私が個人ディレクトリにいるとき、git configでuser.nameは正しい名前を与えますが、コミットをプッシュするためにはデフォルトの名前が必要ですが、個人名が必要です。
swapnil2993

@ swapnil2993最初にパスの問題について考えますが、git config user.name正しいものを返す場合は問題ありません。GNU / Linuxまたはその他のOSを使用していますか?
bcag2

@ bcag2は問題を解決しました。パスを修正しました。しかし、正しい値を返すgit config user.nameは奇妙でした。答えてくれてありがとう。
swapnil2993

14

明確にするために、現在のリポジトリ設定ファイル--localを使用することもできます

git config --local user.name "John Doe" 

12

また、使用する必要GIT_CONFIGがあるファイルを環境変数にポイントすることもできgit configます。でGIT_CONFIG=~/.gitconfig-A git config key value指定されたファイルを操作します。


2
涼しい; 少し巧妙なシェルマジックを使用すると、これを使用して設定を行うことができます。これにより、gitは、dirツリーを現在のリポジトリより上に移動したときに最初に見つかった.gitconfigを選択します。ありがとう!
ecmanaut 2013年

1
これを行うこのシェルマジックへのリンクはありますか?便利ですね!
pchiusano 2013

1
@pchiusanoここの魚で、それの基本的なバージョンだgithub.com/CtrlC-Root/dotfiles/blob/master/.config/fish/...は
CTRLCルート

1つの環境変数を変更するだけで済む簡単な解決策をありがとうございます。
Noah Sussman、2018年

それは今だけのgit configコマンドに影響を与えるgithub.com/git/git/blob/master/Documentation/RelNotes/...
foray1010

12

私はこれを私のメールに対して次のようにしています:

git config --global alias.hobbyprofile 'config user.email "me@example.com"'

その後、新しい作業プロジェクトのクローンを作成するgit hobbyprofileと、実行するだけで、そのメールを使用するように構成されます。


3

もう1つの方法は、direnvを使用して、ディレクトリごとに構成ファイルを分離することです。例えば:

.
├── companyA
│  ├── .envrc
│  └── .gitconfig
├── companyB
│  ├── .envrc
│  └── .gitconfig
└── personal
   ├── .envrc
   └── .gitconfig

それぞれ.envrcに次のようなものが含まれているはずです:

export GIT_CONFIG=$(pwd)/.gitconfig

そして.gitconfig、望ましい値を持つ通常のgitconfigです。


2

リポジトリ固有の構成ファイル(つまり、/path/to/repo/.git/config)を変更することで、プロジェクトのGit構成をカスタマイズできます。ところで、git configデフォルトではこのファイルに書き込みます:

cd /path/to/repo
git config user.name 'John Doe'  # sets user.name locally for the repo

異なるプロジェクト(例:内~/.gitconfig.d/)に個別のプロファイルを作成しそれらをリポジトリの設定ファイルに含めることを好みます。

cd /path/to/repo
git config include.path '~/.gitconfig.d/myproject.conf'

これは、単一のプロジェクトに属する複数のリポジトリで同じオプションセットを使用する必要がある場合にうまく機能します。シェルエイリアスまたはカスタムGitコマンドを設定して、プロファイルを操作することもできます。


0

私は同じ船に乗っています。それらを管理するための小さなbashスクリプトを書きました。 https://github.com/thejeffreystone/setgit

#!/bin/bash

# setgit
#
# Script to manage multiple global gitconfigs
# 
# To save your current .gitconfig to .gitconfig-this just run:
# setgit -s this
#
# To load .gitconfig-this to .gitconfig it run:
# setgit -f this
# 
# 
# 
# Author: Jeffrey Stone <thejeffreystone@gmail.com>

usage(){
  echo "$(basename $0) [-h] [-f name]" 
  echo ""
  echo "where:"
  echo " -h  Show Help Text"
  echo " -f  Load the .gitconfig file based on option passed"
  echo ""
  exit 1  
}

if [ $# -lt 1 ]
then
  usage
  exit
fi

while getopts ':hf:' option; do
  case "$option" in
      h) usage
         exit
         ;;
      f) echo "Loading .gitconfig from .gitconfig-$OPTARG"
         cat ~/.gitconfig-$OPTARG > ~/.gitconfig
         ;;
      *) printf "illegal option: '%s'\n" "$OPTARG" >&2
         echo "$usage" >&2
         exit 1
         ;;
    esac
done

ここのスクリプトはBashにありますが、GithubにはPythonバージョンがあります。また-s、Bashスクリプトでは処理されません。
Vadim Kotov

0

git stashローカルで変更しようとしたときにエラーが発生しました。gitからのエラーは「あなたが誰であるか教えてください」と言ってから、「実行git config --global user.email "you@example.comgit config --global user.name "Your name"てアカウントのデフォルトIDを設定する」ように私に言った。ただし、現在のリポジトリでのみIDを設定するには、-global省略する必要があります。

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