基本上,我收到了这样的请求,可能想要用"匿名贡献者"或者他们电子邮件地址的SHA-1哈希值等方式替换他们的姓名和电子邮件地址。请问是否有相应的方法?
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: eval: Syntax error: end of file unexpected (expecting "fi")
。我通过将结尾的“\”替换为“;”来修复它。 - maxgit fast-export
实现:peff
):fast-export
使用--anonymize
选项:fast-export
,它生成一个可以重建这种存储库的流。git fast-export --anonymize --all |
perl -pe 's/\d+/X/g' |
sort -u |
less
User 0
”,并且我们在输出中保持一致地替换它)。filter-branch
或修改fast-export
输出自己相比)
文档:--anonymize
选项,git将尝试从存储库中删除所有识别信息,同时仍保留足够的原始树和历史模式以重现一些错误。另请参阅Git 2.28(Q3 2020),"git fast-export --anonymize
"学会了采用自定义映射,以允许其用户调整其输出,使其更易于进行调试。
请查看 提交 f39ad38, 提交 8a49495, 提交 65b5d9f (2020年6月25日),以及 提交 d5bf91f, 提交 6416a86, 提交 55b0145, 提交 a0f6564, 提交 7f40759, 提交 750bb32, 提交 b897bf5, 提交 b8c0689 (2020年6月23日),作者为 Jeff King (peff
)。
(由Junio C Hamano -- gitster
--在 提交 0a23331 中合并)
在匿名化存储库之后,很难找到原始版本和结果之间对应的提交,因此很难重现在原始版本中触发错误的命令。让我们使得种子化匿名映射成为可能。这使得用户可以选择:标记要保留的名称(如果他们不认为它们是机密的,则其原始命令将正常工作),或者将名称映射到新值,这使他们能够适应新名称而不会泄露原始信息。实现相当简单。我们已经将每个匿名令牌存储在哈希表中(因此两次出现的相同令牌被转换为相同的结果)。我们只需引入一个新的“种子”哈希表,首先进行查询。这确实向用户承诺了更多关于我们将如何匿名化事物的内容(例如,拆分路径名的标记)。但即使单个令牌的匿名化实际上发生了变化,我们也不太可能想要更改那些规则。这使用户的操作变得更加容易,他们可以仅取消盲目处理目录名称,而无需指定其中的每个路径。这种方法的另一种替代方案是按照我们所看到的进行匿名化,然后将整个refname和pathname映射转储到文件中。这确实有效,但使用起来有点麻烦(您必须手动从映射中挖掘出您关心的项)。
fast-export
: 允许种子化匿名映射协助者: Eric Sunshine
签署者: Jeff King
git fast-export
现在有:
--anonymize-map=<from>[:<to>]
:
在匿名输出中将令牌
<from>
转换为<to>
。
如果省略了<to>
,则将<from>
映射到自身(即不进行匿名处理)。
Reproducing some bugs may require referencing particular commits or paths, which becomes challenging after refnames and paths have been anonymized.
You can ask for a particular token to be left as-is or mapped to a new value.For example, if you have a bug which reproduces with
git rev-list sensitive -- secret.c
, you can run:--------------------------------------------------- $ git fast-export --anonymize --all \ --anonymize-map=sensitive:foo \ --anonymize-map=secret.c:bar.c \ >stream ---------------------------------------------------
After importing the stream, you can then run
git rev-list foo -- bar.c
in the anonymized repository.Note that paths and refnames are split into tokens at slash boundaries.
The command above would anonymizesubdir/secret.c
as something likepath123/bar.c
; you could then search forbar.c
in the anonymized repository to determine the final pathname.To make referencing the final pathname simpler, you can map each path component; so if you also anonymize
subdir
topublicdir
, then the final pathname would bepublicdir/bar.c
.
git fast-export
"(man) 的输出会错误地显示带注释的标签。
请查看提交2f040a9(2021年8月31日)作者为Tal Kelrich(hasturkun
)。
(由Junio C Hamano -- gitster
--于提交febba80中合并,2021年9月10日)
fast-export
:修复使用原始长度的匿名标签签署者:Tal Kelrich
提交7f40759("
fast-export
: 收紧anonymize_mem()
接口以仅处理字符串",2020年6月23日,Git v2.28.0-rc0 -- 合并 列在 批次 #7 中)更改了用于匿名化字符串的接口,但未更新注释标签消息的大小以匹配新的匿名化字符串。因此,导出具有长度超过13个字符的消息的标签将创建无法被快速导入程序解析的输出,因为数据长度指示的比数据输出大。
在匿名化时重置消息大小,并向测试添加一个具有“长”消息的标签。
git commit --amend
修改适当的提交(即添加名称的提交),然后使用git push --force
将您的版本更新到GitHub上。git help reflog
以获取语法和如何在列表中找到它的信息。git filter-branch --env-filter
你可以使用git-filter-branch来更改先前提交的内容/元数据。
请注意,由于您不处理本地分支(它已经被推送到github),因此您无法从已克隆您的分支的任何人中删除作者。
修改已发布的分支通常也是不好的做法,因为这可能会导致跟踪该分支的人感到困惑。
git fast-export
可以成为git filter-branch
的有趣替代品:请参见下面的我的答案。 - VonC