我有一台工作计算机user.email
RotatingPieces@work.tld
到$HOME/.gitconfig
。我的家庭计算机user.email
有Rotating.P@SuperKawaiiAnimeWeb.net
到R.Pieces@DogeMemes.net
。并且有一个RotatingPieces@work.tld
的虚拟机。而笔记本电脑......
这些电子邮件地址对于克隆在这些计算机上的大多数存储库都是正确的。但有时我会混淆我在什么机器上做的事情。在家里和其他方面做工作。
所以,当我在我的公共GitHub / BitBucket / GitLab / Whatever仓库中执行某些操作时,我会提交为Rotating.P@SuperKawaiiAnimeWeb.net
。在家工作会创建$HOME/.gitconfig
提交。因此我偶然将这两个电子邮件地址链接在一起。它一直是偶然发生的。
有什么方法可以阻止这种情况吗?在不同的计算机上使用相同的存储库时,如何阻止自己泄露我的电子邮件地址?
不起作用的事情:
git commit --author=...
个文件。这些电子邮件地址对于克隆在这些计算机上的大多数存储库都是正确的。--author
。我会一直忘记.git/config
选项。Database::Apple
中设置电子邮件地址。这仅适用于此存储库的此计算机。我必须记住,每次我创建一个新的克隆库。太容易忘记了。最好的解决方案是服务器端或客户端提交挂钩,您可以将其提交到存储库,然后由git运行。或者我可以在GitHub Web UI中激活一些钩子或电子邮件地址过滤器。然而,出于明显的滥用原因,可能不存在这样的事情。
有人对解决方案有任何想法吗?
答案 0 :(得分:5)
我有一段时间遇到同样的问题:我希望将不同的电子邮件地址用于工作项目,开源项目,个人项目等等,我希望它能够根据文件夹自动设置结构,而不是记住每个回购。
此解决方案将自动执行基于每个回购设置电子邮件的过程。我要做的一个假设是,您已根据所有者(或者更确切地说,基于您要使用的电子邮件地址)将项目划分为文件夹。 E.g:
code/
work/
(All subfolders use work email.)
open-source/
(All subfolders use open source email.)
personal/
(All subfolders use personal email.)
根据Git Docs,post-checkout挂钩在git clone
命令之后运行,因此我们可以使用全局post-checkout挂钩来设置每个repo的电子邮件。
首先,做:
git config --global init.templatedir '~/.git_template'
(来自Git commit hooks - global settings。)
然后创建该文件夹和名为hooks
的子文件夹。将以下bash脚本添加为~/.git_template/hooks/post-checkout
:
#!/bin/bash
# Automatically set Git config values from parent folders.
dir=$(pwd)
while [ "$dir" != "/" ]
do
# First directory would be the new Git repo, so skip it.
dir=$(dirname $dir)
if [ -f $dir/.gitconfig ]
then
for config in $(git config --file $dir/.gitconfig --list)
do
var=$(echo $config | cut -d = -f 1)
value=$(echo $config | cut -d = -f 2)
actual=$(git config $var)
if [ "$actual" != "$value" ]
then
git config $var $value
fi
done
fi
done
(您也可以在my GitHub repo git-template
找到此脚本。
现在,对于我提到的每个文件夹,添加一个.gitconfig
文件和相应的电子邮件。例如:
git config --file /mnt/data/code/open-source/.gitconfig user.email "open-source@scott-weldon.com"
现在,只要您git clone
进入正确的文件夹,您的存储库就会自动在本地配置中设置正确的电子邮件地址。
奖金功能:
对于那些已经克隆过的回购,您只需cd
到相关的Git目录并直接致电~/.git_template/hooks/post-checkout
即可更新电子邮件。
您可以在.gitconfig
文件中添加所需的任何配置,这些设置也会添加到仓库中。
已知问题:
目前,它会搜索从pwd
到/
的目录,它应该反转订单。这不应该很难修复,所以我会在某些时候将其添加到我的解决方案中。
脚本将在每个 checkout
之后执行,而不是在初始克隆之后执行,因此可能会有很小的性能损失。但是,条件确保如果已经设置了值,或者如果找不到.gitconfig
文件,则不会设置该值。
由于#2,没有办法用特定于回购列表的值覆盖设置。
答案 1 :(得分:2)
我认为最好的解决方案是您在第三个项目符号中所说的内容(在.git/config
中设置本地配置的作者)。这个答案解决了剩下的问题,即记住在每次新克隆之后设置此配置。
假设这些存储库可以用某种模式表示,我最好的想法是在每台机器上都有一个全局预推钩:
答案 2 :(得分:1)
问题是,即使您有办法阻止您使用错误的电子邮件地址,当您使用错误的作者信息时,该系统应该如何知道?如果你在家里做的工作,它究竟应该知道这是工作的东西,所以你通常的家庭地址是错的?这同样适用于另一个方向。
唯一的解决方案是自己记住它,否则它就行不通。因此,您应该在本地为每个存储库设置作者信息。你也可以使用钩子,但是那些也需要为每个存储库单独设置,所以你最好只更改配置(这更容易)。
您还可以设置一个新的shell别名,在运行真正的HOME
命令之前将git
环境变量设置为其他位置。这样,您可以根据您运行的命令在两个环境之间切换。您甚至可以隐藏默认的git
,因此您必须明确选择。
您可以做的另一件事是简单地从全局.gitconfig
中清除作者信息。那样的话,Git会一直警告你。但是,不是在全局设置它,而是为每个存储库单独设置它。这有点乏味,但至少你不得不考虑你想选择哪个身份,