4

我有一个项目,我使用 Git 子树将其合并到一个库中。我已经在库和项目之间进行了一些小改动。

后来,创建了一个新的存储库,它是图书馆的最终归宿。它包含与我的项目基本相同版本的库代码,可能只有一两个小改动。由于各种原因,它不与库的先前主页共享任何直接的 Git 历史记录(它不是先前库的克隆)。

我现在要做的是更改我的项目,以便它从新位置拉/推库。第一次发生这种情况时,我还需要解决任何合并冲突,尽管在这种情况下更改是微不足道的,它们可以稍后重做。

做这个的最好方式是什么?

我尝试在我的项目中删除该库的副本,然后将其与旧的遥控器和分支一起删除。然后我尝试从新位置进行子树添加等。这似乎可行,但是当我尝试从我的项目推回库时,我遇到了一个致命的坏对象错误。

我认为我尝试过的方法存在缺陷 - 可能与缺乏共享历史有关 - 但我对正在发生的事情没有足够深入的了解,不知道如何解决它,或者什么应该是解决这个问题的“正确”方法。

[更新:编辑了问题以使其更清晰-有点模棱两可]

4

3 回答 3

1

您是否有任何理由不将您的库作为项目中的子模块引用?
(查看子模块的真实性质

在您的情况下,优势在于更改子模块地址是多么容易。

于 2010-07-22T06:27:36.780 回答
1

尝试克隆新项目。然后将您的添加为遥控器并执行

git remote update

这将从您的项目中提取所有参考。现在做

git cherry-pick <sha1>

您在新项目中想要的 sha。这是我认为最简单的方法。

此外,您应该知道 git 不需要一个共同的历史记录(尽管它在第一次合并时不太好)。所以你可以按照我说的去做,然后你可以合并你的历史,而不是挑选樱桃。它可能会有冲突。我建议一旦你开始合并(如果你这样做的话)使用git mergetool并知道如何使用 3-way diff。

于 2010-07-12T04:40:33.827 回答
1

也许,您应该使用您的库版本(仅包含您更改的库树)设置一个单独的工作分支(或存储库),然后您可以将其推送回原始库存储库。

因此,为了推送到原始远程仓库,首先在本地准备您希望远程提交的内容;可以有不同的工作流程来实现这一点:或者,在项目工作期间,您首先将库更改提交到专用于库的特殊本地工作分支(该分支应该继承库的原始历史记录),然后合并此带有库的分支更改为您的项目工作分支(其中库是子树),或者将您的更改从项目工作分支合并回专用的库工作分支。然后,您可以根据需要将您的专用库工作分支推送到原始远程仓库。

因此,本质上,首先您创建一个本地专用工作分支,以便它继承原始历史记录:

git branch MY_LIBFOO REMOTE_BRANCH_LIBFOO

(REMOTE_BRANCH_LIBFOO 是您感兴趣的本地存储的远程分支,由 git fetch 更新)

然后,按照您的工作流程,确保您对库的更改位于工作分支 MY_LIBFOO 中,然后您可以

git push original_libfoo MY_LIBFOO:TARGET_BRANCH_REMOTELY

这样,就可以清楚地了解正在发生的事情。

于 2010-07-27T12:59:09.870 回答