Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 在BFG(历史编辑)之后,所有提交都会重复_Git_Bfg Repo Cleaner - Fatal编程技术网

Git 在BFG(历史编辑)之后,所有提交都会重复

Git 在BFG(历史编辑)之后,所有提交都会重复,git,bfg-repo-cleaner,Git,Bfg Repo Cleaner,我不知道用BFG删除大文件/敏感文件的干净方法,错过了一个关键步骤: git克隆--镜像git://example.com/some-big-repo.git 当我试图将其推到远程时,导致了历史冲突,我天真地解决了这些冲突 git pull origin master——允许不相关的历史记录,合并一些冲突,然后推送 这会重复提交,有时会重复5-10次 因为我是一个人在做回购协议,所以我没有选择将其清理干净并从更合理的副本重新启动,也不必担心不同的提交是不同的,我确信它们是相同的 是否有一个蛮力命

我不知道用BFG删除大文件/敏感文件的干净方法,错过了一个关键步骤:
git克隆--镜像git://example.com/some-big-repo.git

当我试图将其推到远程时,导致了历史冲突,我天真地解决了这些冲突
git pull origin master——允许不相关的历史记录
,合并一些冲突,然后推送

这会重复提交,有时会重复5-10次

因为我是一个人在做回购协议,所以我没有选择将其清理干净并从更合理的副本重新启动,也不必担心不同的提交是不同的,我确信它们是相同的

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

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

不可以。但是,您可以放弃合并提交,这将旧历史和新历史联系在一起。这不会抹去旧的历史,但你可以停止使用它。最终,如果你的Git找不到它,它会掉下来

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


两个不同的提交哈希ID是两个不同的提交,不可能对任何提交进行任何更改。这就是为什么BFG(和Git自己的
Git过滤器分支
)复制所有提交:它们实际上无法更改旧的提交。这就是为什么你得到了所有东西的两份副本

首先,你制作了新的拷贝,把旧的拷贝换成了新的。BFG就是这么做的。(这并不是git filter branch所做的:它不会扔掉旧的,它只是把它们推到一边,然后让你扔掉它们。)

到目前为止还不错。但是,然后运行
git fetch
来提取所有旧提交,然后使用选项
git merge
:现在将旧提交和新提交粉碎在一起,即使它们彼此没有关系

如果您的新旧提交历史记录非常简单,我们可以这样绘制:

A--B--...--H   <-- origin/master

A'-B'-...--H'  <-- master
(其中
M
的第一个父项是
H'
,而
M
的第二个父项是
H
)。你自己的Git中的名字
origin/master
是你自己Git的记忆,而
origin
的Git一直在说,我的
master
是:他们仍然把commit
H
记为他们的
master

如果您从自己的分支
master
的提示中删除commit
M
,您将在自己的存储库中保留以下内容:

A--B--...--H    <-- origin/master
            \
             M   [abandoned]
            /
A'-B'-...--H'   <-- master
要让您的Git调用
origin
的Git,请确保他们拥有所有重写的提交(
A'-…-H'
),然后向他们发送一个强制的表单命令:是的,这会使您失去提交
H
的权限,但请将
master
设置为指向提交
H'
。他们通常会遵守此命令,如果他们不遵守,您必须找出他们不遵守的原因(例如GitHub的“受保护分支”功能),并首先修复该问题,然后他们将拥有:

A--B--...--H   [abandoned]

A'-B'-...--H'  <-- master
当裸机服务器存储库(例如GitHub上的存储库)有足够的时间到期时(通常更短),但在您自己的存储库中超过30天,当Git的垃圾收集器运行并清理时,放弃的提交将被垃圾清除。在这一点上,没有人会记住原始的散列ID,原始的命令也将无处可寻


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

通过查看?在什么意义上是“以前”来查看您以前的提交吗?原来的那些,在BFG推拉之前就在那里了?我如何区分它们?
git push --force origin master
A--B--...--H   [abandoned]

A'-B'-...--H'  <-- master
A--B--...--H   [abandoned]
            \
             M   [abandoned]
            /
A'-B'-...--H'   <-- master, origin/master