Git:获取后从不相关的存储库中删除更改或如何修复"警告:没有常见的提交"?

时间:2015-01-09 21:47:06

标签: git

我用

$ git remote show origin 
* remote origin
  Fetch URL: git://gitorious.org/bash/bash.git

但自2011年以来没有任何新的变化。所以我谷歌官方消息来源:http://savannah.gnu.org/git/?group=bash

我决定创造新的起源:

$ git remote rename origin gitorious
$ git remote add origin git://git.savannah.gnu.org/bash.git

fetch最新更改,以便比较发生的情况(git log master..origin/master):

$ git fetch origin 
warning: no common commits
remote: Counting objects: 23368, done.
remote: Compressing objects: 100% (3449/3449), done.
^Cceiving objects:   8% (1895/23368), 8.51 MiB | 478.00 KiB/s    

在我看到warning: no common commits后,我打破了提取并漫游如何从本地存储库中删除这些不相关的提取更改(我知道我需要干净clone)。

hg我感觉更好,除非你-f,否则它总会抱怨不相关的存储库。

2 个答案:

答案 0 :(得分:3)

如果要完全丢弃以前的遥控器,只需将其删除即可:

git remote remove <remote-name>

但这样做只是为了删除远程条目和远程跟踪分支标签。让我展示两个遥控器的(非常)简化示例,其中包含两个不相关的提交DAG,以及您自己的本地更改。我们打电话给两个遥控器rmt1rmt2(现在可能实际上是gitorious而另一个origin,但我想稍微概括一点):

           L     <-- master
         /
A0 <- A1 <- A2     <-- rmt1/master

B0 <- B1 <- B2 <- B3   <-- rmt2/master

A提交代表您从远程rmt1(最初的远程,可能是gitorious)带来的所有内容。在这里,您有一个本地提交L,您对从rmt1获得的内容进行了一些更改,并且您刚刚添加了远程rmt2并带来了在其提交图上(B提交)。

如果您现在运行git remote remove rmt1,git将删除配置行以及rmt1/master标签。这就是你剩下的,不计算那些隐形但没有被垃圾收集的提交:

           L     <-- master
         /
A0 <- A1

B0 <- B1 <- B2 <- B3   <-- rmt2/master

这里的问题是您自己的本地更改(commit L)使用,因此保留至少一些原始提交图 - A - 系列提交。

据推测,您要做的是找到 not rmt1提交的部分或全部本地提交,查看您要保留的更改,以及在B - 系列提交中找到一些合适的提交来进行这些更改。如果只有一个本地提交,就像在这种情况下,这很容易;但如果有很多,你必须决定要保留哪一个。

在许多情况下,您现在拥有一个或两个分支机构,并且这些分支的提示符是您要保留的。在这种情况下,您可以简单地保存旧的git存储库,通过克隆B系列(在本例中来自git.savannah.gnu.org)创建一个全新的git存储库,并选择一些分支。新的仓库,您将移动您的活动分支提示。在这里,您只需使用已保存的存储库来提取补丁(例如git diff或git format-patch),然后将其导入新存储库。这在概念上要简单得多。

在其他情况下,您可能真的希望将两个远程回购内容保留在一个回购中,至少在一段时间内,直到您可以改变或以其他方式保留您的更改。这是保存和复制两组DAG的便捷方式,它允许您在任何(独立)图中对提交使用git命令,包括在一个图中将树与另一个图中的树进行区分。它在概念上更复杂,是您目前的方向。

我不能在不了解你的情况的情况下推荐一种方法或另一种方法。

答案 1 :(得分:1)

这只是一个警告。将会有两个不相关的提交树(例如gitk将它们视为无关,一个接一个),但除此之外不会有其他差异,所有git命令(diff,{{1} },merge等)继续按预期工作。

要清除/隐藏不需要的修订,您可以简单地删除对它们的引用,这是整个git的通用规则。对于第二个远程存储库,这意味着您需要删除相应的cherry-pickremote。您还可以在git remote rm origin.git/refs/remotes/<remote-name>手动删除参考。

删除引用后,最终将删除存储库中的相应对象并回收空间。您也可以手动运行.git/packed-refs