我有一台工作计算机,并且全局配置为在提交时使用我的工作电子邮件和名称。这很好。但是,我想制定某种规则,“如果回购来源是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"
这避免了对脚本中的值进行硬编码,从而使其更具可移植性。可能?
答案 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.name
和user.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" "$@"