.gitconfigで自分に複数のユーザーを指定できますか?


755

私の~/.gitconfig[user]は、Githubリポジトリに使用したいので、に個人のメールアドレスを記載しています。

しかし、最近は仕事でもgitを使い始めました。私の会社のgitリポジトリはコミットを許可していますが、新しいチェンジセットのアナウンスを送信するとき、それは私のメールアドレスを認識しないため、匿名からのものであると言っています.gitconfig-少なくとも、それは私の理論です。

で複数の[user]定義を指定することは可能.gitconfigですか?または.gitconfig、特定のディレクトリのデフォルトを上書きする他の方法はありますか?私の場合、すべての作業コードをチェックアウトします~/worksrc/- .gitconfigそのディレクトリ(およびそのサブディレクトリ)のみにを指定する方法はありますか?


git-config#FILESを参照してください。
Josh Lee、

1
あなたの会社のサーバーがそれをするのに私は驚いています-それが機能するためにはあなたのコミットのshaを変更しなければならないでしょう。ローカルチェックアウトにコミットする場合、どのユーザー名が表示されますか?
Alex Brown

1
@アレックス:重要な部分を忘れてしまった-それは簡単にメール通知の名前であり、実際にはコミットで何も変更していません。
Cascabel 2010年

1
git-hookを使用して、この定期的な作業を自動化できます:github.com/DrVanScott/git-clone-init
Henning

1
この回答を受け入れてください:stackoverflow.com/a/43654115/482899。git 2.13以降の最適なソリューションです。
ノースツリー2017

回答:


1017

個別のリポジトリを設定して、グローバル設定を上書きする特定のユーザー/メールアドレスを使用できます。リポジトリのルートから実行します

git config user.name "Your Name Here"
git config user.email your@email.com

一方、デフォルトのユーザー/メールは〜/ .gitconfigで設定されています

git config --global user.name "Your Name Here"
git config --global user.email your@email.com

83
これらの設定の影響は.git/configファイルで確認できます
Abizern

21
git config --editおよびを使用して、これらの構成ファイルを手動で編集できますgit config --global --edit。また、Abizernのコメントを見逃した場合、リポジトリの設定ファイルはにあり<repo-root>/.git/configます。
Rory O'Kane 2012

13
GIT_AUTHOR_EMAILGIT_COMMITTER_EMAIL(および* _NAME)もローカル設定を上書きするため、これらの設定を解除する必要があります
ACyclic

6
個別のリポジトリではなく、特定のフォルダ内のすべてのリポジトリに対してこれを行う方法はありますか?ここで私の質問を参照してください:stackoverflow.com/questions/21307793/...
scubbo

6
本日リリースされた最新のソリューションについては、以下の回答を参照してくださいGit 2.13
テジャスブバネ

491

git 2.13以降、新しく導入された条件付きインクルードを使用してこれを解決できます

例:

グローバル設定〜/ .gitconfig

[user]
    name = John Doe
    email = john@doe.tld

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

作業固有の設定〜/ work / .gitconfig

[user]
    email = john.doe@company.tld

48
git 2.13がリリースされた今、これが最良の答えです。
テジャスブバネ

1
独自の.gitconfigファイルがない場合、このソリューションはincludeステートメントで指定されたサブディレクトリ内のすべてのサブディレクトリで機能しますか?私はそう思うだろうが、これまでのところテストはこれを証明していない。
ゲーリー

2
@Garyはい、私の経験とドキュメントによれば、「パターンが/で終わる場合、**が自動的に追加されます。たとえば、パターンfoo /はfoo / **になります。つまり、「foo」とその中のすべてに再帰的に一致します。」、「; $ HOME / to / group内のすべてのリポジトリに含める[includeIf "gitdir:〜/ to / group /"]」
TomášJanoušek2017年

6
gitdirは「/」最後を含める必要があります。
Chris Yim 2017

5
git config --list別のディレクトリで実行することにより、再帰的に機能することを確認できます。そのサブディレクトリに~/work/gitリポジトリが含まれている場合、includeIfが有効になります。のサブディレクトリに~/work/gitリポジトリが含まれていない場合、includeIfは実行されないことに注意してください。
NZD

105

または、ローカル.git/configファイルに次の情報を追加できます

[user]  
    name = Your Name
    email = your.email@gmail.com

27
...これは、@ discomurrayが推奨するコマンドが手動で実行する方法です。
user456584 2014

1
リモートごとにこれの複数の行を追加することは可能ですか?
Abel Callejo 2017

55

1つのコマンドgithubアカウントの切り替え

このソリューションは、単一のgitエイリアスの形式をとります。実行すると、現在のプロジェクトユーザーは別のアカウントにアタッチされます

SSH鍵を生成する

ssh-keygen -t rsa -C "rinquin.arnaud@gmail.com" -f '/Users/arnaudrinquin/.ssh/id_rsa'

[...]

ssh-keygen -t rsa -C "arnaud.rinquin@wopata.com" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'

それらをGitHub / Bitbucketアカウントにリンクする

  1. デフォルトの公開鍵をコピーする pbcopy < ~/.ssh/id_rsa.pub
  2. GitHubアカウントにログインします
  3. add SSH keygithubページにキーを貼り付けます
  4. 他の公開鍵をコピーする pbcopy < ~/.ssh/id_rsa_pro.pub
  5. 他のすべてのアカウントについて、手順2〜4を繰り返して適用します。

手順1. sshキーの自動切り替え。

ssh応じて特定の暗号化キーを使用するように構成できますhost。良い点は、同じに複数のエイリアスを設定できることですhostname

次のサンプル~/.ssh/configファイルを参照してください。

# Default GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

# Professional github alias
Host github_pro
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_pro

gitリモート設定

で変更することgit@github.comにより、これらのエイリアスをgitリモートで使用できるようになりましたgit@github_pro

(のようなものを使用してgit remote set-url origin git@github_pro:foo/bar.git)既存のプロジェクトをリモートで変更するか、それらを複製するときに直接変更することができます。

git clone git@github.com:ArnaudRinquin/atom-zentabs.git

エイリアスを使用すると、次のようになります。

git clone git@github_pro:ArnaudRinquin/atom-zentabs.git

ステップ2. git user.emailを変更する

Git構成設定は、グローバルまたはプロジェクトごとにすることができます。この場合、プロジェクトごとの設定が必要です。変更は非常に簡単です。

git config user.email 'arnaud.rinquin@wopata.com'

これは簡単ですが、開発者にとっては長くかかります。そのための非常に単純なgitエイリアスを作成できます。

それを~/.gitconfigファイルに追加します。

[user]
    name = Arnaud Rinquin
    email = rinquin.arnaud@gmail.com

...

[alias]
    setpromail = "config user.email 'arnaud.rinquin@wopata.com'"

その後、私たちがしなければならないことはgit setpromail、このプロジェクトのみのメールを変更することです。

ステップ3. 1つのコマンドスイッチでお願いします。

単一のパラメーターなしのコマンドで、デフォルトのアカウントから指定したアカウントに切り替えるのは良いことではないでしょうか。これは間違いなく可能です。このコマンドには2つのステップがあります。

  • 現在のプロジェクトのリモートを選択したエイリアスに変更します
  • 現在のプロジェクトのuser.email設定を変更する

すでに2番目のステップ用の1つのコマンドソリューションがありますが、最初のコマンドソリューションは非常に困難です。1つのコマンドのリモートホストの変更

ここにあなたに追加する別のgit aliasコマンドの形で解決策があります~/.gitconfig

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"

これにより、すべてのリモートを1つのホストから別のホスト(エイリアス)に変更できます。例を参照してください。

$ > git remote -v
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (push)

$ > git changeremotehost github.com github_pro

$ > git remote -v
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (push)

それらをすべて組み合わせる

2つのコマンドを1つに結合する必要があります。これは非常に簡単です。bitbucketホストスイッチングの統合方法もご覧ください。

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"
  setpromail = "config user.email 'arnaud.rinquin@wopata.com'"
  gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"

ソースリンク-チュートリアル


これは素晴らしいです、ありがとう。私はメールごとに多数のリポジトリを使用しているので、代わりにsetpromailエイリアスがconfig --global代わりに使用します(別のメールアドレスを設定するための別のエイリアスを設定しています)。できます!
michel-slm

1
これらの2つの異なるアカウントについて、どのようにして異なるgpgキーで署名できますか?2x githubアカウント用の2x gpgキーがあり、別の方法で署名したい。"git config --global user.signingkey xxxx"
hakkican

この答えは素晴らしいです。他の答えから何を見つけたかと思ったので、ほとんど読みませんでした。間違いなく、より多くの賛成投票に値します。PS。useConfigOnly = true他の回答と組み合わせるとさらに良いです。
steinybot 2018年

IdentifyFileではなく、IdenfityFileです。
クリスチャン

40

Orr Sellaのブログ投稿からインスピレーションを得た後~/.git/templates/hooks、ローカルリポジトリの情報に基づいて特定のユーザー名と電子メールアドレスを設定するpre-commitフック(にあります)を書きました./.git/config

テンプレートディレクトリへのパスを次の場所に配置する必要があります~/.gitconfig

[init]
    templatedir = ~/.git/templates

次に、各git initまたはgit cloneそのフックをピックアップして、次の時にユーザーデータを適用しますgit commit。既存のリポジトリにフックを適用する場合はgit init、リポジトリを再初期化するために内部で実行します。

ここに私が思いついたフックがあります(それはまだいくつかの磨きが必要です-提案は大歓迎です)。名前を付けて保存

~/.git/templates/hooks/pre_commit

または

~/.git/templates/hooks/post-checkout

そしてそれが実行可能であることを確認してください: chmod +x ./post-checkout || chmod +x ./pre_commit

#!/usr/bin/env bash

# -------- USER CONFIG
# Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
git_remotes[0]="Github"
git_remotes[1]="Gitlab"

# Adjust names and e-mail addresses
local_id_0[0]="my_name_0"
local_id_0[1]="my_email_0"

local_id_1[0]="my_name_1"
local_id_1[1]="my_email_1"

local_fallback_id[0]="${local_id_0[0]}"
local_fallback_id[1]="${local_id_0[1]}"


# -------- FUNCTIONS
setIdentity()
{
    local current_id local_id

    current_id[0]="$(git config --get --local user.name)"
    current_id[1]="$(git config --get --local user.email)"

    local_id=("$@")

    if [[ "${current_id[0]}" == "${local_id[0]}" &&
          "${current_id[1]}" == "${local_id[1]}" ]]; then
        printf " Local identity is:\n"
        printf "»  User: %s\n»  Mail: %s\n\n" "${current_id[@]}"
    else
        printf "»  User: %s\n»  Mail: %s\n\n" "${local_id[@]}"
        git config --local user.name "${local_id[0]}"
        git config --local user.email "${local_id[1]}"
    fi

    return 0
}

# -------- IMPLEMENTATION
current_remote_url="$(git config --get --local remote.origin.url)"

if [[ "$current_remote_url" ]]; then

    for service in "${git_remotes[@]}"; do

        # Disable case sensitivity for regex matching
        shopt -s nocasematch

        if [[ "$current_remote_url" =~ $service ]]; then
            case "$service" in

                "${git_remotes[0]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[0]}"
                    setIdentity "${local_id_0[@]}"
                    exit 0
                    ;;

                "${git_remotes[1]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[1]}"
                    setIdentity "${local_id_1[@]}"
                    exit 0
                    ;;

                * )
                    printf "\n»  pre-commit hook: unknown error\n» Quitting.\n"
                    exit 1
                    ;;

            esac
        fi
    done
else
    printf "\n»» An Intermission\n»  No remote repository set. Using local fallback identity:\n"
    printf "»  User: %s\n»  Mail: %s\n\n" "${local_fallback_id[@]}"

    # Get the user's attention for a second
    sleep 1

    git config --local user.name "${local_fallback_id[0]}"
    git config --local user.email "${local_fallback_id[1]}"
fi

exit 0

編集:

そのため、私はフックをPythonのフックアンドコマンドとして書き直しました。さらに、スクリプトをGitコマンド(git passport)として呼び出すこともできます。また~/.gitpassport、プロンプトで選択可能な任意の数のIDをconfigfile()内に定義することもできます。プロジェクトはgithub.comにあります。git -passport-Pythonで記述された複数のGitアカウント/ユーザーIDを管理するためのGitコマンドとフック


1
これはきちんと動作します。ただし、これを(コミット後ではなく)チェックアウト後のフックにすることで、よりうまく機能しました。この回答を改善するための私の提案は次のとおりです:1.スニペットを〜/ .git / templates / hooks / post-checkoutとして保存しchmod +x post-checkout、権限を付与する必要があります。2. git_remotes値はホスト名全体の最初の部分です。たとえばgit@github.com、 3. local_id値は、ユーザーがそれぞれの名前と電子メールアドレスに編集する必要があります。
Shantanu Kumar 14

@ShantanuKumarコメントありがとうございます。あなたが提案したように私は答えを調整しました。多分私はすぐにPythonでスクリプトを書き直すでしょう。
Saucier 14

正規表現とリモートのないリポジトリのサポートが追加されました。簡単にダウンロードするには、ここにすべてをマージします。同じサービスの異なるプロジェクトのIDを区別する正規表現。またgit init、IDEからの新しいプロジェクトeclipse(インタラクティブなプリコミットトリガーを処理できないなど)の場合、たとえばデフォルトのIDでリモートレスリポジトリをサポートすることは理にかなっています
cfi

25

デフォルトの電子メールアドレス(Githubユーザーへの電子メールアドレスリンク)が必要ない場合は、要求するように構成できます。これを行う方法は、使用するgitのバージョンによって異なります。以下を参照してください。

(意図された)欠点は、リポジトリごとに1回メールアドレス(および名前)を設定する必要があることです。ですから、忘れることはできません。

バージョン<2.7.0

[user]
    name = Your name
    email = "(none)"

Orr Sellaのブログ投稿の~/.gitconfig Dan Aloniによるコメントで述べられているように、グローバル構成で。リポジトリで最初のコミットを行おうとすると、gitは失敗して素敵なメッセージが表示されます。

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '(none)')

この名前は、電子メールアドレスがローカルに設定されているときにグローバル構成から取得されます(メッセージは完全に正確ではありません)。

2.7.0≤バージョン<2.8.0

バージョン2.7.0未満の動作は意図されておらず、2.7.0で修正されました。Orr Sellaのブログ投稿で説明されているように、まだpre-commitフックを使用できます。このソリューションは他のバージョンでも機能しますが、他のバージョンではこのソリューションは機能しません。

バージョン≥2.8.0

Dan Aloniはその動作を実現するオプションを追加しました(リリースノートを参照)。一緒に使う:

[user]
    useConfigOnly = true

これを機能させるために、グローバル構成で名前または電子メールアドレスを指定しないでください。次に、最初のコミット時にエラーメッセージが表示されます

fatal: user.useConfigOnly set but no name given

したがって、メッセージはそれほど有益ではありませんが、オプションを明示的に設定しているので、何をすべきかを知っている必要があります。バージョン2.7.0未満のソリューションとは対照的に、常に名前と電子メールの両方を手動で設定する必要があります。


私はこの方法を数か月使用しましたが、うまくいきました。複数のメールアドレス(個人用、仕事用)があり、グローバルgitconfigで「デフォルト」のアドレスを設定したくありません。特別な値 "(none)"を使用すると、ユーザー名とホスト名に基づいてアドレスを推測する代わりに、gitは新しいリポジトリを起動するたびに有効なアドレスを提供するように要求します(これは煩わしいため、-修正する必要があります)。しかし、最近Gitのアップグレードバージョン(2.7.0、おそらくそれ以前)を使用すると、特別な値 "(none)"が致命的なエラーをトリガーしないことがわかりました。代わりに、「John Doe <(none)>」をそのまま使用します...
Zhuoyun Wei

@wzyboy:ああ、あなたは正しいです。私は以前git bisect19ce497cのコミットがこの動作を紹介していることを発見しました。ただし、バージョン(2.5〜2.7)にemail =関係なく、(引数なしで)configで使用できemail = "(none)"、古いバージョンと同じ動作を示します。これを確認できますか?もしそうなら、私は私の答えを編集します。私はそれがとても明白で、以前にそれを使用したことがないので、ただ懐疑的です。
ジョン

email =2.7.0で試しましたが、Gitはまだユーザー名とホスト名に基づいてメールアドレスを推測しています。私は現在pre-commit、Sellaのブログでアプローチを使用しています。また"(none)"、Sellaの投稿でアイデアを思いついたDan Aloniに通知し、彼はこれを機能として正式に実装するためのパッチを提出しました:permalink.gmane.org/gmane.comp.version-control.git/285301
Zhuoyun Wei

3
git-2.8以降: "user.useConfigOnly"構成変数を使用して、ユーザーが常にuser.email&user.name github.com/git/git/blob/master/Documentation/RelNotes/2.8.0を
rofrol 2016年

@rofrol情報をありがとう。私はそれに応じて私の答えを更新しました。
John

24

、条件が含まれて Gitの2.13で、少し仕事を1つのマシン上で複数のユーザー/電子メール共存を持つことができるようになりました。

user.gitconfig私の個人名とメールがあります。work-user.gitconfig私の仕事名とメールがあります。両方のファイルが~パスにあります。

したがって、私の個人名/メールはデフォルトで適用されます。以下のためにc:/work/、DIR、私の仕事名/電子メールが適用されます。以下のためにc:/work/github/、DIR、私の個人名/電子メールが適用されます。これは、最後の設定が適用されるときに機能します。

# ~/.gitconfig
[include]
    path = user.gitconfig
[includeIf "gitdir/i:c:/work/"]
    path = work-user.gitconfig
[includeIf "gitdir/i:c:/work/github/"]
    path = user.gitconfig

gitdir大文字と小文字が区別され、gitdir/i大文字と小文字は区別されません。

"gitdir/i:github/"githubパスにあるすべてのディレクトリに条件付きインクルードを適用します。


あなたの答えは高く評価されていますが、トマシュ・ヤヌシェクはあなたの20日前に同じことをしました。この回答を削除することを検討してください。
ヘッジ

5
@ヘッジはい、私は彼の答えに賛成票を投じましたが、Windowsで構成するのにしばらく時間がかかりましたgitdir/i
hIpPy 2017

@hIpPyがこれを実装する特定の方法は、これを私のユースケースに直接適用し、Tomasの回答よりもはるかに簡単に追跡できるようにしました。私は両方に賛成票を投じました。
アイザックアダムス

18

git複数の名前/電子メールを処理する 別のオプションは、エイリアスgitを設定し、-cフラグを使用してグローバルおよびリポジトリ固有の構成をオーバーライドすることです。

たとえば、エイリアスを定義すると、次のようになります。

alias git='/usr/bin/git -c user.name="Your name" -c user.email="name@example.com"'

機能するかどうかを確認するには、次のように入力しgit config user.emailます。

$ git config user.email
name@example.com

エイリアスの代わりに、カスタムgit実行可能ファイルを内に置くこともできます$PATH

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="name@example.com" "$@"

リポジトリ固有の方法に対するこれらの方法の利点は、カスタムプログラムがアクティブなとき.git/configにすべてのgitリポジトリに適用されることですgit。このようにして、(共有)構成を変更することなく、ユーザー/名前を簡単に切り替えることができます。


14

救助のためのgitエイリアス(およびgit configsのセクション)!

エイリアスを追加します(コマンドラインから):

git config --global alias.identity '! git config user.name "$(git config user.$1.name)"; git config user.email "$(git config user.$1.email)"; :'

次に、たとえば設定します

git config --global user.github.name "your github username"
git config --global user.github.email your@github.email

新しいまたは複製されたリポジトリでは、次のコマンドを実行できます。

git identity github

このソリューションは自動ではありませんが、グローバル~/.gitconfigとの設定でユーザーとメールの設定user.useConfigOnlyを解除すると、trueGitは新しいリポジトリまたはクローンされたリポジトリのそれぞれに手動で設定するように通知します。

git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true

1
私はあなたの解決策が好きです。ただし、グローバルの設定を解除すると、gitに特定のリポジトリに設定するよう
通知

12

ここに多くの答えを読んだ後の完全なステップはここにあります

異なるgithubアカウントに複数のSSHキー設定をセットアップする方法

現在保存されているキーの確認を開始することができます

$ ssh-add -l

以前にすべてのキャッシュされたキーを削除することにした場合(オプション、これについて注意

$ ssh-add -D

次に、使用したい/使用する必要がある各メール/アカウントにリンクされたssh pub / privキーを作成できます

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "work@company.com" <-- save it as "id_rsa_work"
$ ssh-keygen -t rsa -C "pers@email.com" <-- save it as "id_rsa_pers"

このコマンドを実行すると、次のファイルが作成されます

~/.ssh/id_rsa_work      
~/.ssh/id_rsa_work.pub

~/.ssh/id_rsa_pers
~/.ssh/id_rsa_pers.pub 

認証エージェントが実行されていることを確認してください

$ eval `ssh-agent -s`

生成されたキーを次のように追加します(〜/ .sshフォルダーから)

$ ssh-add id_rsa_work
$ ssh-add id_rsa_pers

保存したキーをもう一度確認できます

$ ssh-add -l

次に、生成された公開鍵をgithub / bickbuketサーバーに追加する必要があります。

各リポジトリのクローンを別のフォルダーに

ユーザーの作業が機能するフォルダーに移動し、これを実行します

$ git config user.name "Working Hard"
$ git config user.email "work@company.com" 

「.git / config」の内容を確認して、これが何をするかを確認するだけです

ユーザーフォルダに移動しますPERSはこれを仕事と実行されます

$ git config user.name "Personal Account"
$ git config user.email "pers@email.com" 

「.git / config」の内容を確認して、これが何をするかを確認するだけです

結局のところ、これら2つのフォルダーを切り替えるだけで、個人用コードと作業コードをコミットできます。

Git Bashを使用していて、Windowsでsshキーを生成する必要がある場合は、次の手順に従います。

https://support.automaticsync.com/hc/en-us/articles/202357115-Generating-an-SSH-Key-on-Windows


9

間違いを回避するためにうまくいくと思われる簡単な解決策があります。

[user]からセクションを削除するだけで、リポジトリごとに~/.gitconfig設定せずにコミットを実行できなくなりuser.nameます。

あなたには~/.bashrc、ユーザと電子メールのためのいくつかの簡単なエイリアスを追加します。

alias ggmail='git config user.name "My Name";git config user.email me@gmail.com'
alias gwork='git config user.name "My Name";git config user.email me@work.job'

すべてのgitリポジトリで設定を複製する大きな原因ではありません
派手な

9

この回答は、部分的に@Saucierによってポストに触発され、私はセットに自動化された方法を探していたuser.nameuser.email、彼が開発したのgit-パスポートパッケージより少し軽量たリモート、に基づいて、レポごとに。また、useConfigOnly設定については、@ Johnにh / tします。これが私の解決策です:

.gitconfig 変更:

[github]
    name = <github username>
    email = <github email>
[gitlab]
    name = <gitlab username>
    email = <gitlab email>
[init]
    templatedir = ~/.git-templates
[user]
    useConfigOnly = true

次のパスに保存されるチェックアウト後のフック~/.git-templates/hooks/post-checkout::

#!/usr/bin/env bash

# make regex matching below case insensitive
shopt -s nocasematch

# values in the services array should have a corresponding section in
# .gitconfig where the 'name' and 'email' for that service are specified
remote_url="$( git config --get --local remote.origin.url )"
services=(
    'github'
    'gitlab'
)

set_local_user_config() {
    local service="${1}"
    local config="${2}"
    local service_config="$( git config --get ${service}.${config} )"
    local local_config="$( git config --get --local user.${config} )"

    if [[ "${local_config}" != "${service_config}" ]]; then
        git config --local "user.${config}" "${service_config}"
        echo "repo 'user.${config}' has been set to '${service_config}'"
    fi
}

# if remote_url doesn't contain the any of the values in the services
# array the user name and email will remain unset and the
# user.useConfigOnly = true setting in .gitconfig will prompt for those
# credentials and prevent commits until they are defined
for s in "${services[@]}"; do
    if [[ "${remote_url}" =~ "${s}" ]]; then
        set_local_user_config "${s}" 'name'
        set_local_user_config "${s}" 'email'
        break
    fi
done

私はgithubとgitlabに異なる認証情報を使用していますが、上記のコード内のこれらの参照は、使用するサービスで置き換えるか、または拡張することができます。チェックアウト後のフックで自動的にユーザー名を設定し、チェックアウト後にリポジトリのメールをローカルに送信するには、サービス名がリモートURLに表示されていることを確認し、post-checkoutスクリプトのservices配列に追加して、そのセクションを作成します。には、.gitconfigそのサービスのユーザー名とメールが含まれています。

リモートURLにサービス名が表示されない場合、またはリポジトリにリモートがない場合、ユーザー名と電子メールはローカルに設定されません。これらの場合、user.useConfigOnly設定が有効になり、ユーザー名と電子メールがリポジトリレベルで設定されるまでコミットを実行できなくなり、ユーザーにその情報を構成するように求められます。


1
素晴らしいソリューション。chmod 755フックスクリプトを忘れないでください。それ以外の場合は、コピーされますが実行されません。
onekiloparsec

5

GIT_AUTHOR_EMAIL +ローカル .bashrc

.bashrc_local:このファイルは追跡せず、仕事用のコンピューターにのみ配置してください。

export GIT_AUTHOR_EMAIL='me@work.com'
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

.bashrc:このファイルを追跡し、職場と自宅の両方のコンピューターで同じにします。

F="$HOME/.bashrc_local"
if [ -r "$F" ]; then
    . "$F"
fi

私はドットファイルを同期するためにhttps://github.com/technicalpickles/homesickを使用しています

gitconfigのみが環境変数を受け入れる場合:git configでのシェル変数の展開


5

Windows環境

さらにGit Extensions --> Settings --> Global Settings、システムにインストールされている場合は、から変更できます。

gitextensions-latest-release

これらの設定にアクセスするには、Windows環境のフォルダ/ディレクトリを右クリックします。 ここに画像の説明を入力してください

更新バージョン2.49で複数の設定を切り替える/維持する方法 バージョン2.49で複数の設定を切り替える/維持する方法


これは、単に編集するのではなく、複数のユーザーにどのように対処しますか?

@D_N設定を切り替えるオプションを含む新しいスクリーンショットで更新されました。
Abhijeet

ローカルリポジトリフォルダーを開き、ナビゲーションメニューからgit-configを選択し、ローカルリポジトリタブをクリックすると、上記の回答のように、コンテンツが$ local_repo_path / .git / configに適用されます。
maxwu 2018年

3

多分それは単純なハックですが、それは便利です。以下のように2つのSSHキーを生成するだけです。

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/GowthamSai/.ssh/id_rsa): work
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in damsn.
Your public key has been saved in damsn.pub.
The key fingerprint is:
SHA256:CrsKDJWVVek5GTCqmq8/8RnwvAo1G6UOmQFbzddcoAY GowthamSai@Gowtham-MacBook-Air.local
The key's randomart image is:
+---[RSA 4096]----+
|. .oEo+=o+.      |
|.o o+o.o=        |
|o o o.o. +       |
| =.+ .  =        |
|= *+.   S.       |
|o*.++o .         |
|=.oo.+.          |
| +. +.           |
|.o=+.            |
+----[SHA256]-----+

同じ方法で個人用にもう1つ作成します。つまり、職場と会社の2つのSSHキーがあります。work.pub、work、personal.pub、personalを〜/ .ssh /ディレクトリにコピーします

次に、次の行を含むシェルスクリプトを作成し、次の内容でcrev.sh(Company Reverse)という名前を付けます。

cp ~/.ssh/work ~/.ssh/id_rsa
cp ~/.ssh/work.pub ~/.ssh/id_rsa.pub

同じ方法で、次の内容でprev.sh(Personal Reverse)をもう1つ作成します。

cp ~/.ssh/personal ~/.ssh/id_rsa
cp ~/.ssh/personal.pub ~/.ssh/id_rsa.pub

〜/ .bashrcに、以下のようなスクリプトのエイリアスを追加します

alias crev="sh ~/.ssh/crev.sh"
alias prev="sh ~/.ssh/prev.sh"
source ~/.bashrc

会社を使いたいときはいつでもcrevを実行し、個人を使いたい場合はprev :-pを実行してください。

これらのSSHキーをGitHubアカウントに追加します。これらのスクリプトはid_rsaを上書きするため、以前にid_rsaを生成していないことを確認してください。id_rsaをすでに生成している場合は、それをいずれかのアカウントに使用します。それらを個人としてコピーし、個人鍵の生成をスキップします。


1

それを扱うbash関数を作りました。これがGithubリポジトリですです。

記録について:

# Look for closest .gitconfig file in parent directories
# This file will be used as main .gitconfig file.
function __recursive_gitconfig_git {
    gitconfig_file=$(__recursive_gitconfig_closest)
    if [ "$gitconfig_file" != '' ]; then
        home="$(dirname $gitconfig_file)/"
        HOME=$home /usr/bin/git "$@"
    else
        /usr/bin/git "$@"
    fi
}

# Look for closest .gitconfig file in parents directories
function __recursive_gitconfig_closest {
    slashes=${PWD//[^\/]/}
    directory="$PWD"
    for (( n=${#slashes}; n>0; --n ))
    do
        test -e "$directory/.gitconfig" && echo "$directory/.gitconfig" && return 
        directory="$directory/.."
    done
}


alias git='__recursive_gitconfig_git'

1

これを〜/ .bash_profileに追加して、github.comのデフォルトのキーを切り替えます

# Git SSH keys swap
alias work_git="ssh-add -D  && ssh-add -K ~/.ssh/id_rsa_work"
alias personal_git="ssh-add -D && ssh-add -K ~/.ssh/id_rsa"

1

git commit --author "Your Name <your@email.com>"別のユーザーとしてコミットするリポジトリでコミットを実行するときにも使用できます。


0

Rob Wの回答のようなものですが、異なるsshキーを許可し、古いgitバージョン(たとえば、core.sshCommand構成を持たない)で動作します。

私はファイルを作成し、~/bin/git_poweruser実行権限を持ち、PATHに次のようにしました。

#!/bin/bash

TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

cat > $TMPDIR/ssh << 'EOF'
#!/bin/bash
ssh -i $HOME/.ssh/poweruserprivatekey $@
EOF

chmod +x $TMPDIR/ssh
export GIT_SSH=$TMPDIR/ssh

git -c user.name="Power User name" -c user.email="power@user.email" $@

「パワーユーザー」としてコミットまたはプッシュしたいときはいつでも、のgit_poweruser代わりに使用しますgit。任意のディレクトリで動作するはずであり、.gitconfigまたは.ssh/configでの変更は必要ありません。少なくとも私の場合は変更は必要ありません。


0

ほとんどの質問はOPにある程度回答しましたが、私は自分でこれを実行する必要があり、グーグルすることなく、最も迅速で最も簡単な解決策を見つけることができました。簡単な手順は次のとおりです。

  • .gitconfg他のリポジトリから既存のものをコピーする
  • 新しく追加したリポジトリに貼り付けます
  • .gitconfig名前、電子メール、ユーザー名などのファイルの 値を変更する [user] name = John email = john@email.net username = john133
  • .gitignoreリストにファイル名を追加.gitconfigして、作業リポジトリにファイルをコミットしないようにします
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.