私の~/.gitconfig
では、私の個人用電子メールアドレスを[user]
の下にリストしています。それがGithubリポジトリに使いたいからです。
しかし、最近私は仕事にもgitを使い始めました。私の会社のgitリポジトリでコミットすることはできますが、新しいチェンジセットのアナウンスを送信するときは、私の.gitconfig
の電子メールアドレスを認識できないため、Anonymousからのものです。
[user]
に複数の.gitconfig
定義を指定することは可能ですか?それとも、特定のディレクトリのデフォルトの.gitconfig
を上書きする他の方法はありますか?私の場合、すべての作業コードを~/worksrc/
でチェックアウトします - そのディレクトリ(およびそのサブディレクトリ)だけに.gitconfig
を指定する方法はありますか?
グローバル設定を上書きする特定のユーザ/ Eメールアドレスを使用するように個々のリポジトリを設定できます。リポジトリのルートから実行します。
git config user.name "Your Name Here"
git config user.email [email protected]
デフォルトのユーザー/ emailは〜/ .gitconfigで設定されています
git config --global user.name "Your Name Here"
git config --global user.email [email protected]
Git 2.13 なので、新しく導入された Conditional includes を使ってこれを解くことができます。
例:
グローバル設定〜/ .gitconfig
[user]
name = John Doe
email = [email protected]
[includeIf "gitdir:~/work/"]
path = ~/work/.gitconfig
作業固有の設定〜/ work/.gitconfig
[user]
email = [email protected]
または、ローカルの.git/config
ファイルに次の情報を追加することもできます。
[user]
name = Your Name
email = [email protected]
Orr Sellaのブログ投稿 からインスピレーションを得た後、私はローカルリポジトリの~/.git/templates/hooks
内の情報に基づいて特定のユーザー名とEメールアドレスを設定する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
)として呼び出すことも可能です。また、プロンプトで選択可能なconfigfile(~/.gitpassport
)内に任意の数のIDを定義することも可能です。プロジェクトはgithub.comで見つけることができます。 git-passport - 複数のGitアカウント/ユーザーIDを管理するためにPythonで書かれたGitコマンドとフック 。
1つのコマンドgithubアカウントを切り替える
この解決法は単一のgitエイリアスの形をとります。実行されると、現在のプロジェクトユーザーは別のアカウントにアタッチされます
sshキーを生成します
ssh-keygen -t rsa -C "[email protected]" -f '/Users/arnaudrinquin/.ssh/id_rsa'
[...]
ssh-keygen -t rsa -C "[email protected]" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'
あなたのGitHub/Bitbucketアカウントにリンクする
pbcopy < ~/.ssh/id_rsa.pub
add SSH key
githubページに貼り付けますpbcopy < ~/.ssh/id_rsa_pro.pub
Step 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
[email protected]
をgit@github_pro
に変更することで、gitリモートでこれらのエイリアスを使用できるようになりました。
既存のプロジェクトのリモート処理を変更するか(git remote set-url Origin git@github_pro:foo/bar.git
のようなものを使用)、それらを複製するときに直接適用することができます。
git clone [email protected]:ArnaudRinquin/atom-zentabs.git
エイリアスを使用すると、次のようになります。
git clone git@github_pro:ArnaudRinquin/atom-zentabs.git
ステップ2. git user.emailを変更する
Gitの設定はグローバルまたはプロジェクトごとに設定できます。今回の場合、プロジェクトごとの設定が必要です。それを変更するのはとても簡単です:
git config user.email '[email protected]'
これは簡単ですが、私たちがいる開発者にとっては長い時間がかかります。非常に単純なgitエイリアスを書くことができます。
それを~/.gitconfig
ファイルに追加します。
[user]
name = Arnaud Rinquin
email = [email protected]
...
[alias]
setpromail = "config user.email '[email protected]'"
それから、私たちがしなければならないのは、私たちのEメールをこのプロジェクト専用に変更するためのgit setpromail
です。
ステップ3.コマンドスイッチを1つしてください。
デフォルトのアカウントから、指定したアカウントに、パラメータなしの単一のコマンドで切り替えるのはいいことではないでしょうか。これは間違いなく可能です。このコマンドには2つのステップがあります。
2番目のステップには、すでに1つのコマンドによる解決策がありますが、最初の1つの方法はより困難です。 1コマンドリモートホスト変更
これがあなたの~/.gitconfig
に追加するための別のgit aliasコマンドの形の解決策です。
[alias]
changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"
これにより、あるホストから別のホスト(別名)にすべてのリモートを変更できます。例を見てください。
$ > git remote -v
Origin [email protected]:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
Origin [email protected]: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 '[email protected]'"
gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"
デフォルトのEメールアドレス( GithubユーザーへのEメールアドレス )を持ちたくない場合は、尋ねるように設定できます。それをどのように行うことができるかはあなたが使用するgitのバージョンに依存します。下記を見てください。
(意図した)欠点は、リポジトリごとに一度あなたの電子メールアドレス(そしてあなたの名前)を設定しなければならないということです。だから、あなたはそれをするのを忘れることはできません。
[user]
name = Your name
email = "(none)"
Orr Sellaのブログ投稿 のDan Aloniによるコメントに記載されているように、グローバル設定~/.gitconfig
で。リポジトリで最初のコミットを行おうとすると、gitはNiceメッセージで失敗します。
*** Please tell me who you are.
Run
git config --global user.email "[email protected]"
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.7.0で修正されました。 Orr Sellaのブログ投稿 で説明されているように、まだpre-commitフックを使うことができます。このソリューションは他のバージョンでも機能しますが、他のソリューションはこのバージョンでは機能しません。
Dan Aloniは - その振る舞いを実現するためのオプションを追加しました( リリースノートを参照 )。と一緒に使用します。
[user]
useConfigOnly = true
それを機能させるために、グローバル設定で名前やEメールアドレスを与えてはいけません。その後、最初のコミットでエラーメッセージが表示されます。
fatal: user.useConfigOnly set but no name given
そのため、メッセージはそれほど有益ではありませんが、オプションを明示的に設定しているので、何をすべきかを知っておくべきです。バージョン2.7.0未満のソリューションとは対照的に、名前と電子メールの両方を手動で設定する必要があります。
git
を複数の名前/電子メールで機能させるもう1つのオプションは、git
をエイリアスし、-c
フラグを使用してグローバルおよびリポジトリ固有の設定を上書きすることです。
たとえば、エイリアスを定義すると、
alias git='/usr/bin/git -c user.name="Your name" -c user.email="[email protected]"'
それが機能するかどうかを確認するには、単にgit config user.email
と入力します。
$ git config user.email
[email protected]
別名の代わりに、あなたは$PATH
の中にカスタムのgit
実行可能ファイルを入れることもできます。
#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="[email protected]" "$@"
これらのメソッドがリポジトリ固有の.git/config
より優れている点は、カスタムのgit
プログラムがアクティブなときに、すべてのgit
リポジトリに適用されることです。このようにして、(共有)設定を変更せずにユーザー/名前を簡単に切り替えることができます。
条件付きインクルード Git 2.13では、少ない作業で1台のマシンに複数のユーザー/ Eメールを共存させることが可能になりました。
user.gitconfig
は私の個人名とメールアドレスを持っています。 work-user.gitconfig
は私の仕事名とメールアドレスを持っています。両方のファイルは~
パスにあります。
そのため、私の個人名/メールアドレスがデフォルトで適用されます。 c:/work/
dirには、私の仕事名/ emailが適用されます。 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
を持つディレクトリに条件付きインクルードを適用します。
間違いを避けるためにうまくいくように思われる簡単な解決策があります。
[user]
から~/.gitconfig
セクションを削除するだけで、各リポジトリにuser.name
を設定せずにコミットすることができなくなります。
あなたの~/.bashrc
に、ユーザーと電子メールのためにいくつかの簡単なエイリアスを追加してください:
alias ggmail='git config user.name "My Name";git config user.email [email protected]'
alias gwork='git config user.name "My Name";git config user.email [email protected]'
gitエイリアス(およびgit設定のセクション)で救助してください。
(コマンドラインから)エイリアスを追加します。
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 [email protected]
そして、新規またはクローンレポとして、このコマンドを実行することができます。
git identity github
この解決方法は自動的ではありませんが、あなたのグローバル〜/ .gitconfigでユーザーとEメールの設定を解除すると、gitはそれぞれの新規または複製されたリポジトリでそれらを手動で設定するように促します。
git config --global --unset user.name
git config --global --unset user.email
この答えは@Saucierによる投稿に部分的に触発されていますが、私はリモートに基づいてレポジトリごとにuser.name
とuser.email
を設定する自動化された方法を探していました。彼は発達した。 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に異なる認証情報を使用していますが、上記のコード内のそれらの参照は、あなたが使用しているサービスによって置き換えられたり拡張されたりする可能性があります。チェックアウト後にチェックアウト後フックがレポのために自動的にユーザ名とEメールをローカルに設定するようにするには、サービス名がリモートURLに表示されていることを確認し、post-checkout
スクリプトのservices配列に追加してそのセクションを作成しますあなたの.gitconfig
にはあなたのユーザー名とそのサービスのための電子メールが含まれています。
リモートURLにサービス名が表示されない場合、またはリポジトリにリモートがない場合、ユーザー名と電子メールはローカルに設定されません。このような場合、user.useConfigOnly
設定が有効になり、ユーザー名と電子メールがリポジトリレベルで設定されるまでコミットできなくなり、その情報を構成するようにユーザーに促します。
GIT_AUTHOR_EMAIL
+ local .bashrc
.bashrc_local
:このファイルを追跡するのではなく、あなたの仕事用のコンピュータにだけ置いてください。
export GIT_AUTHOR_EMAIL='[email protected]'
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のシェル変数展開
Windows環境
さらにこれをあなたのシステムにインストールしているのなら、Git Extensions --> Settings --> Global Settings
から修正することができます。
これらの設定にアクセスするには、Windows環境のフォルダ/ディレクトリを右クリックします。
これは私がここで多くの答えのステップをたどった後に私がちょうど見つけたものです
異なるgithubアカウントに複数のSSHキーを設定する方法
現在保存されているキーの確認を始めたいと思うかもしれません
$ ssh-add -l
以前にキャッシュされたキーをすべて削除することにした場合( オプション、これに注意してください )
$ ssh-add -D
それから、あなたが使いたい/使う必要があるそれぞれのEメール/アカウントにリンクされたssh pub/privキーを作成することができます。
$ cd ~/.ssh
$ ssh-keygen -t rsa -C "[email protected]" <-- save it as "id_rsa_work"
$ ssh-keygen -t rsa -C "[email protected]" <-- 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サーバーに生成された公開鍵を追加する必要があります
それぞれのレポジトリを異なるフォルダにクローンする
ユーザー work が使用されるフォルダに移動してこれを実行します。
$ git config user.name "Working Hard"
$ git config user.email "[email protected]"
これが何をするのかを見るために、 "。git/config"の内容をチェックしてください。
User pers が使用されるフォルダに移動してこれを実行してください。
$ git config user.name "Personal Account"
$ git config user.email "[email protected]"
これが何をするのかを見るために、 "。git/config"の内容をチェックしてください。
これらすべての後にあなたはスイッチフォルダーによってあなたの個人的なそして仕事のコードをコミットすることができるでしょう
たぶんそれは単純なハックです、しかしそれは役に立ちます。以下のように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 [email protected]
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を実行してください。
あなたのGitHubアカウントにそれらのsshキーを追加してください。これらのスクリプトはid_rsaを上書きするため、id_rsaを以前に生成していないことを確認してください。 id_rsaをすでに生成している場合は、それをいずれかのアカウントに使用します。それらを個人用としてコピーし、個人用鍵の生成をスキップします。
これをあなたの〜/ .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"
私はそれを処理する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'
Rob W's answer のようなものですが、異なった異なるsshキーを許可し、古いgitバージョン(例えばcore.sshCommand configを持っていない)で動作します。
ファイル~/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="[email protected]" $@
"パワーユーザー"として何かをコミットまたはプッシュしたいときはいつでも、私はgit
の代わりにgit_poweruser
を使います。それはどんなディレクトリでも動作するはずで、少なくとも私のものではなく.gitconfig
や.ssh/config
の変更を必要としません。
ほとんどの質問がOPに答えましたが、私はこれを自分で試してみる必要がありました。簡単な手順は次のとおりです。
.gitconfg
をコピーします.gitconfig
ファイルの値(名前、電子メールアドレス、ユーザー名など)を変更する[user] name = John email = [email protected] username = john133
.gitignore
ファイルをコミットしないようにするために、.gitconfig
リストにfilenameを追加します。別のユーザーとしてコミットしたいリポジトリでコミットを行う時点でgit commit --author "Your Name <[email protected]>"
を使用することもできます。