在git repo中删除虚假的第二个根

时间:2019-01-08 12:24:37

标签: git

以某种方式,我们在git repo中有2个根。一是我们期望的,主人和其他分支。另一个是完全不相关的回购。

因此,如果我做git checkout master,我就会得到我们期望的结果。我已经找到了奇数根的最后一个提交哈希,如果我git checkout ca992b28a(用于无头结帐),则会得到另一个随机存储库。

如何删除它? 我如何找到提交者? 提交是我的几个同事正在做的https://github.com/thephpleague/omnipay-sagepay回购的一部分,但这与所讨论的回购完全无关。

该提交指向2016年的提交。 我们的回购中存在提交内容是过去30天。

Sourcetree view of foreign root

2 个答案:

答案 0 :(得分:1)

这听起来像有人犯了一个错误,并将一些代码推送到了错误的存储库。 Git本身不会记录谁推送,但是某些基于git的服务器软件(例如gitlab)可能会保留单独的日志。

一旦提交被推送,Git并不容易将其完全从存储库中删除。但这通常不是问题。您只通常关心分支或标签所引用的提交历史记录。

在您的情况下,您仍然有指向不想要的历史记录的标签。

首先删除所有指向不需要的历史记录的标记,并仔细检查是否有不需要的分支,也将其删除。确保删除远程存储库上的标记和分支,而不仅仅是本地副本。

然后:如果您担心提交历史记录根本不应该存储在存储库中(例如,其中包含敏感的详细信息),则需要彻底清除未使用的历史记录。

相信,可以使用git gc --aggressive完成。 See here

答案 1 :(得分:0)

要找到对新根目录的所有引用,

git for-each-ref --contains=$thenewroot

要从存储库中删除历史记录,一种简单的方法(git会随着对象的老化而清除它们),只需删除对其的引用即可:

git for-each-ref --contains=$thenewroot --format='delete %(refname)' \
| git update-ref --stdin

以及从存储库中清除所有未引用对象的最简单的native-git方法现在,如果您迫不及待想要进行老化,请在之后进行完整的健忘症重新打包:

git repack -ad

但是请注意,无论如何克隆都不会获得未引用的对象,因此仅删除已发布存储库中的不良引用已经意味着将来该存储库中的任何克隆都不会在不需要的历史记录中获得对象。

相关问题