无效BFG使用后Git合并重复

Bor*_* V. 7 git merge github git-rewrite-history bfg-repo-cleaner

我已经被整个存储库深深地淹没了(仅由我使用)并且可以使用一些帮助来整理它.

这就是我做的.我意识到在我的提交历史中,有一些文件包含我不想放置的凭据.因此,我决定合法并尝试使用BFG Repo-Cleaner来解决这些问题.我把所有凭据都放在.gitignores中,然后继续试图将它们从历史中删除.根据文档说明,我执行了以下命令:

git clone --mirror myrepo.git
java -jar bfg.jar --delete-files stuffthatshouldbedeleted.txt  myrepo.git
Run Code Online (Sandbox Code Playgroud)

此时,BFG告诉我已经找到并删除了x个文件.甜.

cd myrepo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push
Run Code Online (Sandbox Code Playgroud)

根据终端日志,它更新了回购.到目前为止一切都那么好吧?我弹出我的github帐户,点击几下后,在我的历史记录中找到仍然存在的凭据,文件和所有凭据.我回去尝试相同的命令集,但使用此行而不是文件移除器:

java -jar bfg.jar --replace-text passwords.txt  myrepo.git
Run Code Online (Sandbox Code Playgroud)

其中passwords.txt是一个包含我想要的所有凭据的字符串实例的文件.同样,BFG日志表明它已经修复了几个实例.我推了推,检查,凭证仍在那里,坐在Github.我注意到我所有提交的SHA-1密钥都被更改了,所以假设BFG做了一些事情,而不是我想要它做的事情.

在这一点上,我放弃并尝试重新开始工作,我想稍后会解决这个问题.我做了一些工作,试图推高,得到一个奇怪的合并冲突(你提前50,提交50后).什么?我尝试拉动和合并,突然之间,我的git历史中的每个提交都在名称中重复,其中一些只是空白.我查看了我的Github网络图,看起来有一个第二个分支从我的初始提交开始,它完全反映了我在上一次提交时已经拉链的所有提交(我从未分支,只是线性地匆匆忙忙).

我无法恢复到先前的提交,因为它们都是按时间顺序重复的.我的凭据仍在那里,现在的实例数是原来的两倍,而且我的历史翻了一倍,并且试图理解这一点非常困惑.当我尝试从现在开始运行BFG,克隆并重新镜像repo时,它告诉我它没有凭据,尽管我可以在Github中看到它们.我真的可以帮助理解发生了什么,以及如何,如果有的话,我可以再次回到状态.

我正在考虑删除整个回购并重新开始.我真的不想那样做.

tldr; 尝试使用BFG,在我的仓库中以某种方式复制了所有提交的半成品版本,无法解开,并且加重了伤害,BFG什么也没做,并声称它完成了它的工作.

Rob*_*ley 18

我是BFG的作者,我将尝试根据您的帐户逐步描述我认为发生的事情:

预BFG手动清洗......

首先你:

将所有凭据都丢弃在.gitignores中,然后继续尝试将它们从历史记录中删除.

您对此操作的描述省略了两个基本步骤:

  1. 手动删除当前文件树中的凭据,并将更改提交到您的仓库.如果你没有这样做,BFG就会根除旧提交中的内容,但保护当前提交中的污垢.BFG文档中标题为" 您当前的文件是神圣的...... " 的部分中介绍了此行为,如果您忘记执行此操作,BFG会在您运行它时输出警告消息(" 警告:上面的脏内容可能从其他提交中删除,但由于受保护的提交仍然使用它,它仍然存在于您的存储库中...... "等等).你运行BFG时有没有看到这条消息?

  2. 在克隆存储库的完整镜像之前,需要将该提交推送到GitHub存储库.你忘记了这一步吗?

如果您没有执行这些操作,则会导致您的凭据无法从存储库中完全清除.

第一次运行BFG ......

继续,然后你:

  • 从GitHub制作了一个新的镜像克隆
  • 运行BFG,使用该--delete-files选项进行过滤(您是否看到了受保护内容的警告?)
  • 将更新的存储库推送到GitHub

......在这一点上:

根据终端日志,它更新了回购.到目前为止一切都那么好吧?我弹出我的github帐户,点击几下后,在我的历史记录中找到仍然存在的凭据,文件和所有凭据

所以,假设你没有从你的最新提交运行BFG,你看到了什么之前正确手动删除你的坏的内容是相当怪异.一些可能的原因:

a)存储库没有被--mirror标记克隆,因此GitHub上的所有分支都没有被覆盖,在非主分支中留下了肮脏的历史.但是,您已明确声明您使用了该--mirror标志.

B)即使有镜子推到GitHub上,老提交仍然可用那里时明确承诺-ID引用(即在其提交-ID的GitHub的网址),直到点GitHub上运行,它是自动垃圾收集上你的存储库.拉取请求和分叉也可以保留旧历史记录中的提交.这将是您看到的脏提交的另一种可能的解释.

第二次运行BFG ......

在任何情况下,你都担心,并且:

  • 再次运行BFG,这次--replace-text passwords.txt更新文件内容而不是删除整个文件.

同样,BFG日志表明它已经修复了几个实例.我推了推,检查,凭证仍在那里,坐在Github.

有点好奇的是,BFG表示有更多的内容需要清理 - 可能你的凭据可能在你认为的更多地方 - 但无论如何,无论原因是你在第一次运行后看到它们仍然存在,是你在第二轮比赛后看到它们的原因相同.

回去工作

在这一点上,我放弃并尝试重新开始工作,我想稍后会解决这个问题.

所以,此时你已经重写了你的Git存储库历史记录(两次!)并将其推送到GitHub.但是,根据BFG说明中的规定,您的帐户没有提及删除回购的所有本地版本:

"在这一点上,你已经准备好让每个人都放弃他们旧的回购副本,并做好新的原始数据的新克隆."

那么,你是否在工作机器上删除了旧的Git仓库工作副本,并使用新的Git存储库历史记录重新克隆?您旧旧的回购中的历史将与GitHub当时存在的"已清理"历史不同(即使"清理过的"历史记录不像您希望的那样"清理"!).

我做了一些工作,试图推高,得到一个奇怪的合并冲突(你提前50,提交50后).

如果您在Git仓库的旧本地副本中进行工作(而不是从GitHub重新克隆),那么这就是您所看到的.你实际上是在向GitHub推送50个旧的,脏的历史提交,而对于Git,你似乎幸福地没有意识到已经有50个完全不同的(对于Git,它只关心commit-id)在那个分支上提交.Git认为你正在做的事情有点奇怪('50领先,50背后')并试图告诉你.

让事情变得更糟......

什么?我尝试拉动和合并,突然之间,我的git历史中的每个提交都在名称中重复,其中一些只是空白.我检查了我的Github网络图,看起来有一个第二个分支从我的初始提交开始,它完全反映了我上次提交时已经拉链的所有提交

因此,通过执行pull和merge,您将已清理的历史记录和脏历史记录连接在一起,并使用合并提交将它们统一起来.在排除历史记录方面,这是一个坏主意.一个更好的想法是在清理过的历史记录之上重新定义你的新作品,推送它,删除旧的工作回购,并做一个新的克隆.

善后

当我尝试从现在开始运行BFG,克隆并重新镜像repo时,它告诉我它没有凭据,尽管我可以在Github中看到它们.

这很奇怪,但除了上面已经给出的'GitHub gc'解释之外,我除了操作符错误之外没有任何解释.您可以与我共享存储库(如果您愿意),这样我就可以执行更详细的检查,或者只是向我发送'.bfg-report'目录的压缩副本,这样我就可以看到BFG在其执行时捕获的诊断信息.

复苏

我真的可以帮助理解发生了什么,以及如何,如果有的话,我可以再次回到状态.

我希望我能够解释一些发生的事情.

在整理您的历史记录(即摆脱这两个重复的链)方面,您需要在添加合并提交之前将Git历史记录重置回(已清理)点.查看合并提交,并确定您喜欢的父历史记录.xxxx在进行合并之前,该历史记录中的最后一次提交()是什么?

git reset --hard master xxxx
Run Code Online (Sandbox Code Playgroud)

这可能会失去你在旧的,肮脏的历史上所做的最后一点工作.确定commit(yyyy),并在历史记录之上对其进行rebase,或者只是挑选它:

git cherry-pick yyyy
Run Code Online (Sandbox Code Playgroud)

最后,使用'force'标志将恢复的历史记录推送到GitHub:

git push origin master -f
Run Code Online (Sandbox Code Playgroud)

...压缩旧存储库的存档,然后删除存储库的所有旧本地副本,以防止自己进一步混淆.做一个新的克隆.