特定のプロジェクトに正しいID(名前と電子メール)を使用するようにgitに指示するにはどうすればよいですか?


117

私は個人のラップトップを仕事と個人のプロジェクトの両方に使用しており、仕事でのコミットには仕事用のメールアドレス(gitolite)を使用し、残り(github)には個人のメールアドレスを使用したいと考えています。

私はすべてグローバルまたは一時的な次のソリューションについて読みました:

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • GIT_AUTHOR_EMAILGIT_COMMITTER_EMAILまたはEMAIL環境変数のいずれかを設定する

1つの解決策は、自分の環境をworkまたはpersonalに設定するシェル関数を手動で実行することですが、正しいIDに切り替えるのを忘れて、間違ったIDでコミットすることがよくあると確信しています。

特定のリポジトリ、プロジェクト名などをID(名前、電子メール)にバインドする方法はありますか?人々は何をしますか?


1
いずれかの答えを受け入れてください。私はそれらの1つがあなたの問題を解決するのを助けたに違いないと思います。
RBT 2017年

回答:


134

git config user.email "bob@example.com"

これをリポジトリ内で実行すると、グローバルではなく、そのリポジトリに構成が設定されます。

私があなたを誤解しているのでない限り、それはあなたが何を望んでいるのとほとんど同じようです。


それでうまくいくと思います。特にすべてを再コンパイルせずにブランチをより簡単に切り替えるために、同じプロジェクトに複数のローカルリポジトリがあることを期待しています。たぶんそれは単に悪いsvnの習慣です。ありがとう。
マーティンジャンボン、

1
@Martin-私は実際にgitを長い間使用していませんが、複数のローカルリポジトリを使用することはgitの珍しいワークフローであると感じています。それでも、レポのインスタンスでこれを1回実行するだけでよく、そのレポの存続期間に設定されているので、それほど悪くはありません。
Dan Ray、

@DanRayマーティンの場合のように、ローカルリポジトリにコミットされていないローカルファイルがある場合、これは実際には一般的な設定です。あるブランチから別のブランチに切り替えても、ファイルは自動的に再構築されません。「すべてを再コンパイルすること」を回避することが目標である場合は、複数のローカルリポジトリを使用することが正しい方法です。
ドルメン

1
git config --global user.email "bob@example.com" --globalを追加すると、すべてのリポジトリで機能します。出典:help.github.com/articles/setting-your-username-in-git
SashiOno

1
これは手動のタスクであり、忘れられる可能性があります。自動解決策は@ dragon788と私によって提案されています
naitsirch

47

以下のローカルのsetコマンドを使用する必要があります。

ローカルセット

git config user.email mahmoud@company.ccc
git config user.name 'Mahmoud Zalt'

ローカルゲット

git config --get user.email
git config --get user.name

ローカル設定ファイルはプロジェクトディレクトリにあります:.git/config

グローバルセット

git config --global user.email mahmoud@zalt.me
git config --global user.name 'Mahmoud Zalt'

グローバルゲット

git config --global --get user.email
git config --global --get user.name

ホームディレクトリにあるグローバル設定ファイル:~/.gitconfig

空白などを引用することを忘れないでください。例: 'FirstName LastName'


23

「.git」フォルダ内の設定ファイルを編集して、リポジトリに依存する異なるユーザー名と電子メールを維持します

  • リポジトリに移動します
  • 非表示のファイルを表示し、「。git」フォルダに移動します
  • 「config」ファイルを見つける
  • EOFに以下の行を追加します

[ユーザー]

名前=ボブ

メール= bob@example.com

以下のコマンドは、このリポジトリに設定されているユーザー名と電子メールを示します。

git config --get user.name

git config --get user.email

例:D:\ workspace \ eclipse \ ipchat \ .git \ configにある構成ファイル

ここでipchatは私のレポ名です


16

使用git config user.email "foo@example.com"すると、現在のプロジェクトにバインドされます。

それが私が私のプロジェクトのためにやっていることです。リポジトリを複製/初期化するときに、適切なIDを設定します。それは誰にでもできることではありません(あなたがそれを理解する前に忘れて押し込んだ場合、あなたは夢中になっています)しかし、それは言う能力なしに得ることができるのと同じくらい良いですgit config --global user.email 'ILLEGAL_VALUE'

実際には、違法な値を作ることができます。あなたのセットgit config --global user.name $(perl -e 'print "x"x968;')

次に、非グローバル値を設定するのを忘れると、エラーメッセージが表示されます。

[編集]別のシステムでは、「致命的:非常に長い個人識別子」で失敗するようにxの数を968に増やす必要がありました。同じバージョンのgit。奇妙な。


それは素晴らしいトリックのように聞こえますが、私にはうまくいきませんでした。コミットとgitoliteリモートへのプッシュの両方が成功しました。
マーティンジャンボン、

@Martin Jambon:奇妙です。私はgitバージョン1.7.4.5を使用しています
Seth Robertson

@Martin Jambon:グローバルユーザー名/メールアドレスを「x」に設定してみることもできます。古いバージョンのgitは小さすぎる値を拒否しました。これが機能しない場合は、どのgitバージョン/ OSを使用しているかを報告してください。
セスロバートソン、

@Martin Jambon:968 "x"を試してみて、うまくいくかどうかを確認してください。
セスロバートソン

8

--globalパラメータを使用しない場合は、現在のプロジェクトの変数のみが設定されます。


8

Git 2.13 includeIf以降では、gitconfigでを使用して、gitコマンドを実行しているリポジトリのパスに基づいて異なる構成のファイルを含めることができます。

十分に新しいGitにはUbuntu 18.04が付属しているので、私はこれを~/.gitconfigかなり幸せに使用しています。

[include]
  path = ~/.gitconfig.alias # I like to keep global aliases separate
  path = ~/.gitconfig.defaultusername # can maybe leave values unset/empty to get warned if a below path didn't match
# If using multiple identities can use per path user/email
# The trailing / is VERY important, git won't apply the config to subdirectories without it
[includeIf "gitdir:~/projects/azure/"]
  path = ~/.gitconfig.azure # user.name and user.email for Azure
[includeIf "gitdir:~/projects/gitlab/"]
  path = ~/.gitconfig.gitlab # user.name and user.email for GitLab
[includeIf "gitdir:~/projects/foss/"]
  path = ~/.gitconfig.github # user.name and user.email for GitHub

https://motowilliams.com/conditional-includes-for-git-config#disqus_thread

Git 2.13を使用するには、PPA(18.04より古いUbuntu / Debian)を追加するか、バイナリをダウンロードしてインストールする必要があります(Windows /その他のLinux)。


非常に役に立ち、まさに私が探していたもの。git config core.sshCommand複数の秘密鍵と組み合わせると、完全なシームレスなgitアイデンティティ管理が可能になります。
TOPR

0

1つの解決策は、自分の環境を仕事用または個人用に設定するシェル関数を手動で実行することですが、正しいIDに切り替えるのを忘れて、間違ったIDでコミットすることがよくあると確信しています。

それがまさに私の問題でした。リモートのgithubがあり、ローカルのユーザー名が定義されていない場合に警告するフックスクリプトを作成しました。

設定方法は次のとおりです。

  1. グローバルフックを保持するディレクトリを作成します

    mkdir -p ~/.git-templates/hooks

  2. git initまたはcloneを実行するときに、~/.git-templatesプロジェクトごとの.gitディレクトリにすべてをコピーするようにgitに指示します

    git config --global init.templatedir '~/.git-templates'

  3. そして、次の行をにコピーし~/.git-templates/hooks/pre-commitてファイルを実行可能にします(これを忘れると、gitは実行しません!)

#!/bin/bash

RED='\033[0;31m' # red color
NC='\033[0m' # no color

GITHUB_REMOTE=$(git remote -v | grep github.com)
LOCAL_USERNAME=$(git config --local user.name)

if [ -n "$GITHUB_REMOTE" ] && [ -z "$LOCAL_USERNAME" ]; then
    printf "\n${RED}ATTENTION: At least one Github remote repository is configured, but no local username. "
    printf "Please define a local username that matches your Github account.${NC} [pre-commit hook]\n\n"
    exit 1
fi

プライベートリポジトリに他のホストを使用している場合はgithub.com、必要に応じて置き換える必要があります。

これで、a git initまたはgit clonegit を実行するたびに、このスクリプトがリポジトリにコピーされ、コミットが完了する前に実行されます。ローカルユーザー名を設定していない場合は、警告が出力され、コミットできません。


0

このテーマに関する彼の記事(Git IDの設定を参照)でのMicah Henningのやり方がとても気に入っています。作成または複製された各リポジトリーにIDを適用および強制するという事実は、毎回これをセットアップすることを忘れないようにするための良い方法です。

基本的なgit設定

gitで現在のユーザー設定を解除します。

$ git config --global --unset user.name
$ git config --global --unset user.email
$ git config --global --unset user.signingkey

新しいローカルリポジトリごとにID構成を強制します。

$ git config --global user.useConfigOnly true

identityコマンドの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 user.signingkey "$(git config user.$1.signingkey)"; :'

アイデンティティの作成

GPGを使用してIDを作成します(使用するgpggpg2、システムで取得したものに応じて)。使用するIDごとに次の手順を繰り返します。

注:作成された秘密鍵の識別子[keyid]は次のとおりです。ここに例:

sec   rsa4096/8A5C011E4CE081A5 2020-06-09 [SC] [expires: 2021-06-09]
      CCC470AE787C057557F421488C4C951E4CE081A5
uid                 [ultimate] Your Name <youremail@domain>
ssb   rsa4096/1EA965889861C1C0 2020-06-09 [E] [expires: 2021-06-09]

8A5C011E4CE081A5後の部分はキーsec rsa4096/識別子です。

$ gpg --full-gen-key
$ gpg --list-secret-keys --keyid-format LONG <youremail@domain>
$ gpg --armor --export [keyid]

公開鍵ブロックをコピーして、GPGキーとしてGitHub / GitProviderOfChoice設定に追加します。

IDをGit構成に追加します。また、追加するIDごとにこれを繰り返します。

注:ここでは、自分のID gitlab名前付けるために使用していますが、質問からは、例:gitoliteや、などgithub、何でもかまいませんwork

$ git config --global user.gitlab.name "Your Name"
$ git config --global user.gitlab.email "youremail@domain"
$ git config --global user.gitlab.signingkey [keyid]

リポジトリのIDを設定する

新しいリポジトリにIDが関連付けられていない場合、コミット時にエラーが表示され、設定するように通知されます。

*** Please tell me who you are.

## parts of message skipped ##

fatal: no email was given and auto-detection is disabled

新しいリポジトリで必要なIDを指定します。

$ git identity gitlab

これで、gitlab IDでコミットする準備ができました。

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