46

我有一台工作计算机,它被全局配置为在提交时使用我的工作电子邮件和姓名。这很好。但是,我想制定一些规则,“如果 repo 来源是 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值的要求。

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

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

4

5 回答 5

41

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

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

然后在 ~/code/work/.gitconfig 中:

[user]
    email = self@work.com

当然,您可以为任意多个工作领域做到这一点。

于 2017-09-15T12:24:31.943 回答
21

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

于 2012-12-06T21:29:46.667 回答
7

我编写了 post-checkhout 挂钩来根据存储库的原始 URL 设置存储库的本地作者详细信息。

它不使用通配符域,尽管它使用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.nameuser.email用于“签署”您的提交。由于提交是独立于存储库的(例如,当您推送它们时,相同的提交将在许多不同的存储库中),因此这些属性不依赖于远程。

您可以做的是在通过 https 连接到不同的遥控器时设置不同的日志记录。您只需将用户名放在 url 中,在表单中https://username@host/path/to/repo.git,您就完成了。

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

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

如果您真的想这样做,也许您可​​以使用钩子制作一些东西,将您的提交推送到您计算机上的另一个仓库,而另一个仓库(再次通过钩子)将重新编写提交,更改作者,然后推送到另一个遥控器。

但这太讨厌了,我会否认告诉过你这件事;)

于 2012-12-06T19:28:56.270 回答
2

Mike 的回答类似,但由于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" "$@"
于 2018-01-16T08:16:50.360 回答