我有一台工作电脑,它被全局配置为在提交时使用我的工作电子邮件和姓名。这很好。然而,我想制定一些规则,“如果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"
这避免了在脚本中硬编码值,使其更具可移植性。
6条答案
按热度按时间yebdmbv41#
Git 2.13 adds对条件配置的支持包括。如果您将 checkout 组织到每个工作域的目录中,那么您可以根据 checkout 的位置添加自定义设置。在全局git配置中:
然后在~/code/work/.gitconfig中:
当然,你可以在任何你喜欢的工作领域中这样做。
xxb16uws2#
Git中没有内置的东西可以做到这一点(据我所知),但下面的shell脚本似乎工作得相当可靠。修改它,让它具有你在登录GitHub时想要的用户名和电子邮件地址,然后将它保存为一个名为“git”的可执行文件,位于“真实的的”git之前的某个位置。
我在我的机器上对
ssh
使用了类似的技巧--我希望ssh在运行时更改窗口背景色,然后在退出时再更改回来--它对我来说工作得很可靠。另外,请注意,这是硬编码的,只查看名为
origin
的远程。nxowjjhe3#
我写了post-checkhout钩子来根据仓库的原始URL设置仓库的本地作者详细信息。
它不做通配符域,尽管它使用了
git config --urlmatch
,据称这将回落到最接近的匹配URL。看看这里:https://github.com/boywhoroared/dotfiles/blob/master/git/template/hooks/post-checkout.d/author
oymdgrw74#
user.name
和user.email
用于“签署”你的提交。因为提交是独立于仓库的(比如说,当你推送它们时,相同的提交会在很多不同的仓库中),所以这些属性不是远程依赖的。你可以做的是在通过https连接到不同的远程时设置不同的日志记录。你只需要把用户名放在url中,格式为
https://username@host/path/to/repo.git
,就完成了。但是提交作者是相同的
user.name
,因为提交是在本地进行的,然后只是与其他人共享。由于提交者的身份也是提交的一部分,如果你提交了两个除了提交者的名字和email地址之外完全相同的提交,那么这两个提交将有不同的哈希值,所以它们将是两个不同的git提交。这将是一个混乱:)
如果你真的想这样做,也许你可以用钩子做一些东西,把你的提交推到你电脑上的另一个仓库,而另一个仓库(再次通过钩子)会重写提交,改变作者,并推到另一个远程仓库。
但它是如此肮脏,我会否认告诉你关于这一点;)
bvjxkvbb5#
类似于Mike's answer,但由于第四行的
uniq
命令,即使在shell中启动shell,它也不会导致fork bomb。h7appiyu6#
~/.gitconfig
~/.gitconfig.work
这样,如果存储库包含任何远程匹配的
https://git.work.com/**
,则~/.gitconfig.work
中的用户详细信息将被包含并覆盖~/.gitconfig
中的设置