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

mfpqipee  于 2023-04-19  发布在  Git
关注(0)|答案(6)|浏览(178)

我有一台工作电脑,它被全局配置为在提交时使用我的工作电子邮件和姓名。这很好。然而,我想制定一些规则,“如果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"

这避免了在脚本中硬编码值,使其更具可移植性。

yebdmbv4

yebdmbv41#

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

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

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

[user]
    email = self@work.com

当然,你可以在任何你喜欢的工作领域中这样做。

xxb16uws

xxb16uws2#

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的远程。

nxowjjhe

nxowjjhe3#

我写了post-checkhout钩子来根据仓库的原始URL设置仓库的本地作者详细信息。
它不做通配符域,尽管它使用了git config --urlmatch,据称这将回落到最接近的匹配URL。
看看这里:https://github.com/boywhoroared/dotfiles/blob/master/git/template/hooks/post-checkout.d/author

oymdgrw7

oymdgrw74#

user.nameuser.email用于“签署”你的提交。因为提交是独立于仓库的(比如说,当你推送它们时,相同的提交会在很多不同的仓库中),所以这些属性不是远程依赖的。
你可以做的是在通过https连接到不同的远程时设置不同的日志记录。你只需要把用户名放在url中,格式为https://username@host/path/to/repo.git,就完成了。
但是提交作者是相同的user.name,因为提交是在本地进行的,然后只是与其他人共享。
由于提交者的身份也是提交的一部分,如果你提交了两个除了提交者的名字和email地址之外完全相同的提交,那么这两个提交将有不同的哈希值,所以它们将是两个不同的git提交。这将是一个混乱:)
如果你真的想这样做,也许你可以用钩子做一些东西,把你的提交推到你电脑上的另一个仓库,而另一个仓库(再次通过钩子)会重写提交,改变作者,并推到另一个远程仓库。
但它是如此肮脏,我会否认告诉你关于这一点;)

bvjxkvbb

bvjxkvbb5#

类似于Mike's answer,但由于第四行的uniq命令,即使在shell中启动shell,它也不会导致fork bomb。

#!/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" "$@"
h7appiyu

h7appiyu6#

~/.gitconfig

[user]
    name = John Doe
    email = jdoe@private.com

[includeIf "hasconfig:remote.*.url:https://git.work.com/**"]
    path = .gitconfig.work

~/.gitconfig.work

[user]
    name = John Doe
    email = jdoe@work.com

这样,如果存储库包含任何远程匹配的https://git.work.com/**,则~/.gitconfig.work中的用户详细信息将被包含并覆盖~/.gitconfig中的设置

相关问题