我使用多台具有不同 gitconfigs 的计算机。如何停止将我的电子邮件地址泄露给 GitHub?
I use several computers with different gitconfigs. How do I stop leaking my e-mail addresses to GitHub?
我有一台工作计算机,其中 $HOME/.gitconfig
有 user.email
到 RotatingPieces@work.tld
。我家的电脑有 $HOME/.gitconfig
有 user.email
到 Rotating.P@SuperKawaiiAnimeWeb.net
。还有 R.Pieces@DogeMemes.net
的虚拟机。笔记本电脑有......
这些电子邮件地址对于在这些机器上克隆的大多数存储库都是正确的。但有时我确实混淆了我在什么机器上做什么。在家做事,反之亦然。
因此,当我在我的 public GitHub/BitBucket/GitLab/Whatever 存储库中执行某些操作时,我会以 RotatingPieces@work.tld
的身份提交。在家工作创建的提交为 Rotating.P@SuperKawaiiAnimeWeb.net
。正因为如此,我不小心将这两个电子邮件地址 link 放在了一起。它总是偶然发生的。
有什么办法可以阻止这种情况吗?在不同机器上处理同一个存储库时,我该怎么做才能避免泄露我的电子邮件地址?
不起作用的东西:
- 正在更改
$HOME/.gitconfig
个文件。这些电子邮件地址对于在这些机器上克隆的大多数存储库都是正确的。
- 使用
git commit --author=...
。我会一直忘记 --author
选项。
- 在克隆存储库的
.git/config
中设置电子邮件地址。这仅适用于此存储库的本机。每次我创建存储库的新克隆时,我都必须记住这一点。太容易忘记了。
最好的解决方案是服务器端或客户端提交挂钩,您可以将其提交到存储库,然后由 git 运行。或者我可以在 GitHub 网络 UI 中激活一些挂钩或电子邮件地址过滤器。然而,由于明显的滥用原因,这样的事情可能不存在。
有人对解决方案有任何想法吗?
我认为最好的解决方案是您在第三个项目符号中所说的(在 .git/config
中的本地配置中设置作者)。这个答案解决了剩下的问题,即记住在每个新克隆之后设置这个配置。
假设这些存储库可以用某种模式来表达,我最好的想法是在每台机器上都有一个全局预推送挂钩:
- 检查远程 URL(预推送挂钩第二个参数)是否与您的 public 存储库的模式匹配。
- 如果它们匹配:检查来自本地配置的当前作者电子邮件是否是预期的。
- 如果可以:继续推送。
- 否则:中止推送。
- 否则:继续推送。
问题是,即使您有办法防止您使用错误的电子邮件地址,该系统应该如何知道您何时使用了错误的作者信息?如果你在家里工作,它究竟应该如何知道这是工作,所以你通常的家庭地址是错误的?另一个方向也一样。
唯一的办法就是自己记住,不然就不行了。因此,您应该在本地为每个存储库设置作者信息。你也可以使用 hooks,但是那些也需要为每个存储库单独设置,所以你最好只更改配置(这样更容易)。
您还可以设置一个新的 shell 别名,在 运行 执行真正的 git
命令之前将 HOME
环境变量设置到其他地方。这样你就可以根据你的命令在两个环境之间切换运行。您甚至可以隐藏默认的 git
,因此您必须明确选择。
您可以做的另一件事是简单地从全局 .gitconfig
中清除作者信息。这样,Git 将始终警告您。但是不是全局设置它,而是为每个存储库单独设置它。这有点乏味,但至少你不得不考虑你想选择哪种身份,
我有一段时间遇到同样的问题:我希望工作项目、开源项目、个人项目等使用不同的电子邮件地址,并且我希望它根据文件夹自动设置结构而不是记住每个 repo 都这样做。
此解决方案将自动执行基于每个存储库设置电子邮件的过程。我将做出的一个假设是,您已根据所有者(或者更确切地说,根据您要使用的电子邮件地址)将项目划分到文件夹中。例如:
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
进入正确的文件夹,您的存储库就会自动在本地配置中设置正确的电子邮件地址。
奖励功能:
对于那些你已经克隆的repo,你可以直接cd
到相关的Git目录并直接调用~/.git_template/hooks/post-checkout
来更新邮件。
您可以将任何您想要的配置添加到 .gitconfig
文件中,这些设置也会添加到 repo 中。
已知问题:
当前它搜索从pwd
到/
的目录,当它应该颠倒顺序时。这应该不难解决,所以我会在某个时候将其添加到我的解决方案中。
脚本将在 每 checkout
之后执行,而不是仅在初始克隆之后执行,因此可能会有小的性能损失。但是,条件确保它不会设置值,如果它已经被设置,或者如果没有找到 .gitconfig
文件。
由于 #2,无法使用特定于回购协议的值覆盖设置。
我有一台工作计算机,其中 $HOME/.gitconfig
有 user.email
到 RotatingPieces@work.tld
。我家的电脑有 $HOME/.gitconfig
有 user.email
到 Rotating.P@SuperKawaiiAnimeWeb.net
。还有 R.Pieces@DogeMemes.net
的虚拟机。笔记本电脑有......
这些电子邮件地址对于在这些机器上克隆的大多数存储库都是正确的。但有时我确实混淆了我在什么机器上做什么。在家做事,反之亦然。
因此,当我在我的 public GitHub/BitBucket/GitLab/Whatever 存储库中执行某些操作时,我会以 RotatingPieces@work.tld
的身份提交。在家工作创建的提交为 Rotating.P@SuperKawaiiAnimeWeb.net
。正因为如此,我不小心将这两个电子邮件地址 link 放在了一起。它总是偶然发生的。
有什么办法可以阻止这种情况吗?在不同机器上处理同一个存储库时,我该怎么做才能避免泄露我的电子邮件地址?
不起作用的东西:
- 正在更改
$HOME/.gitconfig
个文件。这些电子邮件地址对于在这些机器上克隆的大多数存储库都是正确的。 - 使用
git commit --author=...
。我会一直忘记--author
选项。 - 在克隆存储库的
.git/config
中设置电子邮件地址。这仅适用于此存储库的本机。每次我创建存储库的新克隆时,我都必须记住这一点。太容易忘记了。
最好的解决方案是服务器端或客户端提交挂钩,您可以将其提交到存储库,然后由 git 运行。或者我可以在 GitHub 网络 UI 中激活一些挂钩或电子邮件地址过滤器。然而,由于明显的滥用原因,这样的事情可能不存在。
有人对解决方案有任何想法吗?
我认为最好的解决方案是您在第三个项目符号中所说的(在 .git/config
中的本地配置中设置作者)。这个答案解决了剩下的问题,即记住在每个新克隆之后设置这个配置。
假设这些存储库可以用某种模式来表达,我最好的想法是在每台机器上都有一个全局预推送挂钩:
- 检查远程 URL(预推送挂钩第二个参数)是否与您的 public 存储库的模式匹配。
- 如果它们匹配:检查来自本地配置的当前作者电子邮件是否是预期的。
- 如果可以:继续推送。
- 否则:中止推送。
- 否则:继续推送。
- 如果它们匹配:检查来自本地配置的当前作者电子邮件是否是预期的。
问题是,即使您有办法防止您使用错误的电子邮件地址,该系统应该如何知道您何时使用了错误的作者信息?如果你在家里工作,它究竟应该如何知道这是工作,所以你通常的家庭地址是错误的?另一个方向也一样。
唯一的办法就是自己记住,不然就不行了。因此,您应该在本地为每个存储库设置作者信息。你也可以使用 hooks,但是那些也需要为每个存储库单独设置,所以你最好只更改配置(这样更容易)。
您还可以设置一个新的 shell 别名,在 运行 执行真正的 git
命令之前将 HOME
环境变量设置到其他地方。这样你就可以根据你的命令在两个环境之间切换运行。您甚至可以隐藏默认的 git
,因此您必须明确选择。
您可以做的另一件事是简单地从全局 .gitconfig
中清除作者信息。这样,Git 将始终警告您。但是不是全局设置它,而是为每个存储库单独设置它。这有点乏味,但至少你不得不考虑你想选择哪种身份,
我有一段时间遇到同样的问题:我希望工作项目、开源项目、个人项目等使用不同的电子邮件地址,并且我希望它根据文件夹自动设置结构而不是记住每个 repo 都这样做。
此解决方案将自动执行基于每个存储库设置电子邮件的过程。我将做出的一个假设是,您已根据所有者(或者更确切地说,根据您要使用的电子邮件地址)将项目划分到文件夹中。例如:
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
进入正确的文件夹,您的存储库就会自动在本地配置中设置正确的电子邮件地址。
奖励功能:
对于那些你已经克隆的repo,你可以直接
cd
到相关的Git目录并直接调用~/.git_template/hooks/post-checkout
来更新邮件。您可以将任何您想要的配置添加到
.gitconfig
文件中,这些设置也会添加到 repo 中。
已知问题:
当前它搜索从
pwd
到/
的目录,当它应该颠倒顺序时。这应该不难解决,所以我会在某个时候将其添加到我的解决方案中。脚本将在 每
checkout
之后执行,而不是仅在初始克隆之后执行,因此可能会有小的性能损失。但是,条件确保它不会设置值,如果它已经被设置,或者如果没有找到.gitconfig
文件。由于 #2,无法使用特定于回购协议的值覆盖设置。