46

仕事用のコンピューターがあり、コミット時に仕事用の電子メールと名前を使用するようにグローバルに構成されています。これはいい。ただし、「レポオリジンがgithubの場合、ユーザーXとメールYを使用する」というようなルールを作りたいと思います。

リポジトリごとに構成エントリを作成できることはわかっていますが、もっと自動化してほしいと思います。クローンが github の場合は、github ユーザーの詳細を使用する必要があります。仕事から複製する場合は、仕事の詳細を使用する必要があります。

これをリモート ドメインに基づいてグローバルに構成する方法はありますか? それとも別の方法ですか?

編集/更新

以下の回答を受け入れましたが、スクリプトを少し変更しました。

#!/usr/bin/env bash

# "Real" git is the second one returned by 'which'
REAL_GIT=$(which -a git | sed -n 2p)

# Does the remote "origin" point to GitHub?
if ("$REAL_GIT" remote -v 2>/dev/null | grep '^origin\b.*github.com.*(push)$' >/dev/null 2>&1); then

    # Yes.  Set username and email that you use on GitHub.
    export GIT_AUTHOR_NAME=$("$REAL_GIT" config --global user.ghname)
    export GIT_AUTHOR_EMAIL=$("$REAL_GIT" config --global user.ghemail)

fi

"$REAL_GIT" "$@"

git config主な追加は、2 つの値の要件です。

git config --global user.ghname "Your Name"
git config --global user.ghemail "you@yourmail.com"

これにより、スクリプトに値をハードコーディングする必要がなくなり、移植性が向上します。多分?

4

5 に答える 5

21

これを行うために Git に組み込まれているものは (私の知る限り) ありませんが、次のシェル スクリプトはかなり確実に機能するようです。GitHub にチェックインするときに必要なユーザー名と電子メール アドレスを持つように変更し、「本物の」git の前のパスのどこかに「git」という名前の実行可能ファイルとして保存します。

#!/usr/bin/env bash

# "Real" git is the second one returned by 'which'
REAL_GIT=$(which -a git | sed -n 2p)

# Does the remote "origin" point to GitHub?
if ("$REAL_GIT" remote -v 2>/dev/null |
    grep '^origin\b.*github.com.*(push)$' >/dev/null 2>&1); then

    # Yes.  Set username and email that you use on GitHub.
    export GIT_AUTHOR_NAME='*** put your name here ***'
    export GIT_AUTHOR_EMAIL='*** put your email address here ***'

fi

"$REAL_GIT" "$@"

私は自分のマシンで同様のトリックを使用していsshます.sshが実行時にウィンドウの背景色を変更し、終了時に元に戻すようにしたいのですが、それは私にとって確実に機能しました.

また、これは という名前のリモートのみを見るようにハードコーディングされていることに注意してくださいorigin

于 2012-12-06T21:29:46.667 に答える
7

リポジトリのオリジン URL に基づいてリポジトリのローカル作成者の詳細を設定する post-checkhout フックを作成しました。

ワイルドカード ドメインは使用しませんがgit config --urlmatch、最も近い一致する URL にフォールバックするとされるものを使用します。

ここで確認してください: https://github.com/boywhoroared/dotfiles/blob/master/git/template/hooks/post-checkout.d/author

于 2015-12-16T11:45:55.753 に答える
2

user.nameコミットにuser.email「署名」するために使用されます。コミットはリポジトリに依存しないため (たとえば、同じコミットをプッシュすると、同じコミットが多くの異なるリポジトリに存在することになります)、これらのプロパティはリモートに依存しません。

できることは、https 経由で異なるリモートに接続するときに異なるログを設定することです。ユーザー名を URL のフォームhttps://username@host/path/to/repo.gitに入力するだけで完了です。

ただし、コミットuser.nameはローカルで行われ、他のユーザーと共有されるだけなので、コミットの作成者は同じです。

コミッターの ID はコミットの一部であるため、コミッターの名前と電子メール以外は同じである 2 つのコミットを作成すると、それらのコミットは異なるハッシュを持つため、git に対する 2 つの異なるコミットになります。それは混乱でしょう:)

本当にこれをやりたい場合は、コミットをコンピューター上の別のレポにプッシュするフックを使用して何かを作成し、その別のレポ (フックを介して) がコミットを書き直し、作成者を変更し、プッシュすることができます。もう一方のリモコン。

しかし、それはとても厄介なので、あなたにそれについて話したことを否定します;)

于 2012-12-06T19:28:56.270 に答える