如果我创建一个Git存储库并公开发布(例如在GitHub上等),并且我从存储库的贡献者那里得到了一个请求,无论出于何种原因删除或隐藏他们的名字,有没有办法轻松地这样做?
基本上,我有这样的请求,并且可能想要用“匿名贡献者”替换他们的姓名和电子邮件地址,或者可能是他们的电子邮件地址或类似的东西的SHA-1哈希。
答案 0 :(得分:6)
Jeff非常正确,正确的轨道是git filter-branch。它需要一个与环境变量一起使用的脚本。对于您的用例,您可能需要这样的内容:
git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "Niko Schwarz" ]; then \
export GIT_AUTHOR_NAME="Jon Doe" GIT_AUTHOR_EMAIL="john@bugmenot.com"; \
fi
'
你可以测试它是这样的:
$ cd /tmp
$ mkdir filter-branch && cd filter-branch
$ git init
Initialized empty Git repository in /private/tmp/filter-branch/.git/
$
$ touch hi && git add . && git commit -m bla
[master (root-commit) 081f7f5] bla
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 hi
$ echo howdi >> hi && git commit -a -m bla
[master a466a18] bla
1 files changed, 1 insertions(+), 0 deletions(-)
$ git log
commit a466a18e4dc48908f7ba52f8a373dab49a6cfee4
Author: Niko Schwarz <niko.schwarz@gmail.com>
Date: Thu Aug 12 09:43:44 2010 +0200
bla
commit 081f7f50921edc703b55c04654218fe95d09dc3c
Author: Niko Schwarz <niko.schwarz@gmail.com>
Date: Thu Aug 12 09:43:34 2010 +0200
bla
$
$ git filter-branch --env-filter '
> if [ "$GIT_AUTHOR_NAME" = "Niko Schwarz" ]; then \
> export GIT_AUTHOR_NAME="Jon Doe" GIT_AUTHOR_EMAIL="john@bugmenot.com"; \
> fi
> '
Rewrite a466a18e4dc48908f7ba52f8a373dab49a6cfee4 (2/2)
Ref 'refs/heads/master' was rewritten
$ git log
commit 5f0dfc0dc9a325a3f3aaf4575369f15b0fb21fe9
Author: Jon Doe <john@bugmenot.com>
Date: Thu Aug 12 09:43:44 2010 +0200
bla
commit 3cf865fa0a43d2343b4fb6c679c12fc23f7c6015
Author: Jon Doe <john@bugmenot.com>
Date: Thu Aug 12 09:43:34 2010 +0200
bla
答案 1 :(得分:2)
如果你必须匿名&#34; git repo不仅适用于一个用户,而且适用于所有用户,Git 2.2(2014年11月)通过改进和增强的 git fast-export
提供了一个有趣的功能:
commit a872275见commit 75d3d65和Jeff King (peff
):
fast-export
--anonymize
选项:有时,用户希望报告他们在存储库中遇到的错误,但他们无权共享存储库的内容。
如果他们能够生成一个与其历史和树具有相似形状但没有泄漏任何信息的存储库,那将是有用的 这个&#34;匿名&#34;然后可以与开发人员共享存储库(假设它仍然复制原始问题)。此补丁实现了&#34;
--anonymize
&#34;fast-export
的选项,它生成可以重新创建此类存储库的流 生成单个流使调用者可以轻松验证他们没有泄漏任何有用的信息。您可以通过运行如下命令来概述将要共享的内容:
git fast-export --anonymize --all |
perl -pe 's/\d+/X/g' |
sort -u |
less
将显示我们生成的每个唯一行,以任何数字为模(每个匿名标记都分配了一个数字,例如&#34;
User 0
&#34;,我们在输出中一致地替换它。 / p>除了匿名化之外,会生成相对较小的测试用例(与原始存储库相比)并且生成速度快(与使用
filter-branch
相比,或修改fast-export
的输出自己)强>
文档:
如果给出
--anonymize
选项,git将尝试从存储库中删除所有标识信息,同时仍保留足够的原始树和历史模式以重现某些错误。使用此选项,git将使用匿名数据替换输出中的所有重新名称,路径,blob内容,提交和标记消息,名称和电子邮件地址。
相同字符串的两个实例将被等效替换(例如,两个具有相同作者的提交将在输出中具有相同的匿名作者,但与原始作者字符串没有相似之处。)
提交,分支和标记之间的关系是+保留的,以及提交时间戳(但提交消息和引用名称与原始文件没有相似之处)。
保留了树的相对构成(例如,如果你有一个包含10个文件和3棵树的根树,输出也是如此),但它们的名称和文件内容将被替换。
答案 2 :(得分:1)
您可以在本地存储库中进行更改,git commit --amend
进行适当的提交(添加名称的位置),然后git push --force
使用您的存储库版本更新github。
具有贡献者名称的原始提交仍然可以在reflog中使用(直到它过期,但需要花费很多精力才能找到它。如果这是一个问题,你也可以删除reflog中的特定提交 - 请参阅git help reflog
了解语法以及如何在列表中找到它。
答案 3 :(得分:1)
如果要更改多个提交,请查看
的手册页git filter-branch --env-filter
您可以使用git-filter-branch来更改先前提交的内容/元。
请注意,由于您没有处理本地分支(它已经被推送到github),因此您无法从已经克隆您的分支的任何人中删除作者。
修改已经发布的分支通常也是不好的做法,因为它可能会导致跟踪分支的人产生混淆。