在我的~/。gitconfig,我列出我的个人电子邮件地址下[用户],因为这是我想用于Github回购。

但是,我最近也开始在工作中使用git。我公司的git回购允许我提交,但是当它发出新的变更集通知时,它说它们来自匿名,因为它不识别我的.gitconfig中的电子邮件地址——至少,这是我的理论。

是否可以在.gitconfig中指定多个[用户]定义?或者是否有其他方法覆盖特定目录的默认.gitconfig ?在我的情况下,我检查了~/worksrc/中的所有工作代码-是否有一种方法只为该目录(及其子目录)指定.gitconfig ?


当前回答

Windows环境

另外,如果您在系统中安装了Git Extensions -> Settings -> Global Settings,则可以修改此选项。

gitextensions-latest-release

右键单击Windows环境中的文件夹/目录以访问这些设置。

更新:如何在2.49版本中切换/维护多个设置

其他回答

如果你不想有一个默认的电子邮件地址(电子邮件地址链接到一个github用户),你可以配置你想要被问到。如何做到这一点取决于你使用的git版本,见下文。

(预期的)缺点是您必须为每个存储库配置一次电子邮件地址(和您的姓名)。所以,你不能忘记去做。

版本< 2.7.0

[user]
    name = Your name
    email = "(none)"

在全局配置中~/。Dan Aloni在Orr Sella的博客文章中评论了gitconfig。当尝试在存储库中进行第一次提交时,git失败了,并给出了漂亮的消息:

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '(none)')

当本地设置电子邮件地址时,该名称取自全局配置(消息不是完全准确)。

2.7.0≤版本< 2.8.0

版本< 2.7.0中的行为不是预期的,并在2.7.0中修复。您仍然可以使用Orr Sella的博客文章中描述的预提交钩子。此解决方案也适用于其他版本,但其他解决方案不适用于此版本。

版本≥2.8.0

Dan Aloni添加了一个选项来实现这种行为(参见发布说明)。用它:

[user]
    useConfigOnly = true

为了让它工作,你可以不给一个名字或电子邮件地址在全局配置。然后,在第一次提交时,您会得到一条错误消息

fatal: user.useConfigOnly set but no name given

因此,该消息不是很有指导意义,但由于您显式地设置了该选项,您应该知道该做什么。与< 2.7.0版本的解决方案相反,您总是必须手动设置名称和电子邮件

$ git config user.name "Your Name"
$ git config user.email "your@email.com"

它只在当前存储库中设置您的姓名和电子邮件。

Windows环境

另外,如果您在系统中安装了Git Extensions -> Settings -> Global Settings,则可以修改此选项。

gitextensions-latest-release

右键单击Windows环境中的文件夹/目录以访问这些设置。

更新:如何在2.49版本中切换/维护多个设置

只需将此添加到~/。Bash_profile在github.com的默认键之间切换

# Git SSH keys swap
alias work_git="ssh-add -D  && ssh-add -K ~/.ssh/id_rsa_work"
alias personal_git="ssh-add -D && ssh-add -K ~/.ssh/id_rsa"

有点像Rob W的答案,但允许不同的ssh密钥,并适用于旧版本的git(没有例如核心)。sshCommand配置)。

我创建了~/bin/git_poweruser文件,具有可执行权限,并在PATH中:

#!/bin/bash

TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

cat > $TMPDIR/ssh << 'EOF'
#!/bin/bash
ssh -i $HOME/.ssh/poweruserprivatekey $@
EOF

chmod +x $TMPDIR/ssh
export GIT_SSH=$TMPDIR/ssh

git -c user.name="Power User name" -c user.email="power@user.email" $@

每当我想以“超级用户”的身份提交或推送一些东西时,我使用git_poweruser而不是git。它可以在任何目录下工作,并且不需要更改.gitconfig或.ssh/config,至少在我的目录中不需要更改。

在看完所有的答案后,这就是我的解决方案:

场景:

本地操作系统:Linux (bash) GitHub上的两个账户(工作/个人) 不同密钥的SSH访问 我的工作帐户将是“主”帐户(因此不需要自定义配置)

配置:

Set a "fake" host, which allows me to select the proper SSH keypair. At ~/.ssh/config: # Personal GitHub account Host github-personal HostName github.com User git IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes "Tell" git it should use a custom configuration within a given directory subtree: At ~/.gitconfig: # My personal projects [includeIf "gitdir/i:~/REPOS/PERSONAL/"] path = ~/REPOS/PERSONAL/personal.gitconfig Finally, my config at ~/REPOS/PERSONAL/personal.gitconfig: # gitconfig for personal projects [user] email = personalemail@example.com [url "git@github-personal"] insteadOf = git@github.com

一旦上述三个到位,我可以克隆一个个人回购像这样:

user@host:~/REPOS/PERSONAL$ git clone git@github.com:jmnavarrol/python-multigit.git
Cloning in 'python-multigit'...
(...)
user@host:~/REPOS/PERSONAL$ cd python-multigit && git remote -v
origin  git@github-personal:jmnavarrol/python-multigit.git (fetch)
origin  git@github-personal:jmnavarrol/python-multigit.git (push)
user@host:~/REPOS/PERSONAL/python-multigit$

在~/REPOS/PERSONAL/ PERSONAL .gitconfig添加了url重写…

[url "git@github-personal"]
  insteadOf = git@github.com

...是什么允许我仅通过脚本中的“标准”URL引用repo, subrepos(即python-multigit本身的情况-是的,蹩脚的自我推销尝试),而不用冒使用“错误”URL的风险,因此,错误的身份验证。

我的意见。