gpt4 book ai didi

git - 在 BFG(历史编辑)之后复制所有提交

转载 作者:行者123 更新时间:2023-12-02 09:06:08 24 4
gpt4 key购买 nike

我不知道使用 BFG 删除大/敏感文件的干净方法,并且错过了一个关键步骤:git clone --mirror git://example.com/some-big-repo.git
其中,当我尝试推送到远程时,导致历史冲突,我天真地解决了git pull origin master --allow-unrelated-histories , merge 了一些冲突,然后推送。

这重复了提交,有时是 5-10 次。

由于我一个人在此 repo 上工作,因此我既没有选择将其清理干净并从更合理的副本重新启动,也不必担心不同的提交是不同的,我确定它们是相同的。

是否有一个蛮力命令可以删除除散列之外在所有方面都相同的所有提交?

最佳答案

Is there a brute-force command to erase all commits that are identical in all aspects but the hashes?



不。但是,您可以放弃 merge 提交,这是将旧历史和新历史联系在一起的原因。这不会抹去旧的历史,但你可以停止使用它。最终,如果您的 Git 找不到它,它就会消失。

您需要做的是运行 git reset --hard在您自己的存储库上(丢弃一次 merge 提交),然后使用 git push -f将所有内容发送至 origin并让他们移动他们的 master .

两个不同的提交哈希 ID 是两个不同的提交,并且不可能更改任何提交的任何内容。这就是为什么 BFG(和 Git 自己的 git filter-branch)复制所有提交:他们实际上无法更改旧提交。这就是你如何得到所有东西的两个副本。

首先,你制作了新的副本并抛弃了旧的副本以支持新的副本。这就是 BFG 所做的。 (这不是 git filter-branch 所做的:它不会扔掉旧的,它只是把它们推到一边,然后让你把它们扔掉。)

到现在为止还挺好。但后来你跑了 git fetch拿起所有旧的提交,跟着 git merge选项:现在将旧的和新的粉碎在一起,即使它们彼此没有关系。

如果您的新旧提交历史非常简单,我们可以这样绘制它们:
A--B--...--H   <-- origin/master

A'-B'-...--H' <-- master

(大写字母代表提交哈希,主要标记,例如 A' 而不是 A ,表明这些是带有更改的副本,这就是为什么它们具有不同的哈希。)大概是你的历史——你的提交——更复杂,但这种表示仍然足够:有一个原始端点提交,如 H ,以及一个新的端点提交 H' , 涉及。

您最后坚持的 merge 执行以下操作:
A--B--...--H    <-- origin/master
\
M <-- master
/
A'-B'-...--H'

(其中 M 的第一个父级是 H'M 的第二个父级是 H )。姓名 origin/master在你自己的 Git 中是你自己的 Git 对什么的内存 origin的 Git 一直在说,我的 master :他们仍然记得提交 H作为他们的 master .

如果您删除提交 M从您自己的分支顶端 master ,您将在自己的存储库中保留它:
A--B--...--H    <-- origin/master
\
M [abandoned]
/
A'-B'-...--H' <-- master

提交 M仍然存在,但您再也看不到它了:没有简单的方法可以找到它。如果您决定要取回它,找到它的不容易的方法将至少再保留 30 天,但最终,他们会让它消失并真正消失。

现在你可以运行:
git push --force origin master

让您的 Git 调用 origin的 Git,确保他们拥有所有重写的提交 ( A'-...-H' ),然后向他们发送以下形式的强制命令:是的,这将失去提交 H 的权限,但设置您的 master指向提交 H'反而。他们通常会遵守这个命令——如果他们不这样做,你必须找出他们不这样做的原因(例如,GitHub 的“ protected 分支”功能)并首先修复它——然后他们将拥有:
A--B--...--H   [abandoned]

A'-B'-...--H' <-- master

(假设你从来没有寄过 M——如果你寄过,他们也会收到,但同样被放弃了)。你的 Git 会看到他们遵守了这个命令,并会更新你的 origin/master反射(reflect)它:
A--B--...--H   [abandoned]
\
M [abandoned]
/
A'-B'-...--H' <-- master, origin/master

当足够的时间到期时——对于裸服务器存储库(例如,GitHub 上的那些)来说通常要短得多,但在你自己的存储库中超过 30 天——当 Git 的垃圾收集器运行并清理时,废弃的提交将被垃圾一扫而光。到那时,没有人会记住原始哈希 ID,原始命令将无处可寻。

好吧,没有任何地方,除了任何其他人用它们制作的克隆。如果有这样的克隆,您可能需要将它们根除并销毁它们,或者至少确保您永远不会再次从它们中获取和 merge ,否则您将再次获得所有旧提交。

关于git - 在 BFG(历史编辑)之后复制所有提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58344737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com