是否可以在.gitconfig中为每个通配符域配置user.name和user.email?

时间:2012-12-06 19:21:05

标签: git github

我有一台工作计算机,并且全局配置为在提交时使用我的工作电子邮件和名称。这很好。但是,我想制定某种规则,“如果回购来源是github,请使用用户X并发送电子邮件Y”

我意识到你可以为每个存储库创建一个配置条目,但我希望它更自动:如果克隆是github,它应该使用github用户详细信息。如果我从工作中克隆,它应该使用工作细节。

有没有办法根据远程域全局配置?或者另一种方式?

EDIT / UPDATE

我接受了下面的答案,但稍微修改了一下脚本:

#!/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值。

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

这避免了对脚本中的值进行硬编码,从而使其更具可移植性。可能?

5 个答案:

答案 0 :(得分:18)

Git没有内置任何东西(据我所知),但是下面的shell脚本看起来非常可靠。在检查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的遥控器。

答案 1 :(得分:15)

Git 2.13 adds对条件配置的支持包括。如果将结帐组织到每个工作域的目录中,则可以根据结帐的位置添加自定义设置。在你的全局git配置中:

[includeIf "gitdir:code/work/"]
    path = /Users/self/code/work/.gitconfig

然后在〜/ code / work / .gitconfig:

[user]
    email = self@work.com

当然,你可以根据自己的喜好为多个工作领域做到这一点。

答案 2 :(得分:5)

我写了post-checkhout hook,根据存储库的原始URL设置repo的本地作者详细信息。

它不会使用通配符域,但它会使用git config --urlmatch,据称它会回退到最接近的匹配网址。

请在此处查看:https://github.com/boywhoroared/dotfiles/blob/master/git/template/hooks/post-checkout.d/author

答案 3 :(得分:1)

user.nameuser.email用于“签署”您的提交。由于提交是独立于repo的(例如,当你推送时,相同的提交将在许多不同的repos中),这些属性不依赖于远程。

您可以做的是通过https连接到不同的遥控器时设置不同的日志记录。您只需将用户名放在网址中,格式为https://username@host/path/to/repo.git即可。

但是提交作者将是相同的user.name,因为提交是在本地进行的,然后只是与其他人共享。

由于提交者的身份是提交的一部分,如果除了提交者的名称和电子邮件之外你做两次相同的提交,那些提交将有不同的哈希值,因此它们将是两个不同的git提交。那将是一团糟:))

如果你真的想要这样做,也许你可以制作带有钩子的东西,将你的提交推送到你计算机上的另一个仓库,而其他仓库(再次通过钩子)会重写提交,更改作者,并推送到另一个远程。

但是这太讨厌我会否认告诉过你的事情;)

答案 4 :(得分:1)

Mike's answer类似,但由于第四行的uniq命令,即使你在shell中启动一个shell,它也不会产生一个fork炸弹。

#!/usr/bin/env bash

# "Real" git is the second one returned by 'which'
REAL_GIT=$(which -a git | uniq | 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" "$@"