如何在维护与这些文件关联的提交的同时将文件从 RepoA 导入到 RepoB?

Posted

技术标签:

【中文标题】如何在维护与这些文件关联的提交的同时将文件从 RepoA 导入到 RepoB?【英文标题】:How to import files from RepoA to RepoB whilst maintaining the commits associated to these files? 【发布时间】:2017-05-10 15:17:10 【问题描述】:

RepoA 内部,有一个目录(directoryA),其中包含一些文件(file1file2file3),我想将这些文件从RepoA 移动到RepoB

这是RepoA

RepoA
    directoryA
        file1
        file2
        file3
    directoryB
        file1
        file2
        file3

在我想做的事情之后,RepoB 看起来像:

RepoB
    directoryA
        file1
        file2
        file3

我可以从RepoA 下载directoryA 并将其上传到RepoB,但我会丢失与file1file2file3 相关的提交。

我也无法将整个 RepoA 转移到 RepoB(如在合并中),因为来自 directoryB 的提交与 RepoA 无关。

编辑:我尝试使用git filter-branch --subdirectory-filter directoryName -- --all

这对我不起作用,每次我在执行该命令后尝试拉动时都会收到错误:

fatal: refusing to merge unrelated histories

【问题讨论】:

你的意思是你希望保留来自回购 A 的历史记录?全部还是只针对与目录相关的文件? 我只想要我正在移动的文件的历史记录,而不是整个 Repo A 的历史记录。 【参考方案1】:

首先,请新建一个分支并检查一下这个过程,因为下面的操作会修改本地RepoA的历史并删除一些文件:

在本地 RepoA 中

(1) git filter-branch --subdirectory-filter directoryA <branch>
(2) mkdir directoryA
(3) mv * directoryA
(4) git add .
(5) git commit -am 'message'

在本地 RepoB 中

(6) git remote add repoA <local RepoA’s path>
(7) git pull RepoA <branch>

如果您在步骤(7) 期间收到错误:fatal: refusing to merge unrelated histories,您可以通过执行git pull RepoA &lt;branch&gt; --allow-unrelated-histories 来忽略不相关的历史记录

然后file1file2file3 的提交历史将显示在 RepoB 中。可以使用gitk --all查看更清晰。

更多详情请参考here。 (前两个 cmets(this 和 this)可能会进一步澄清)。

【讨论】:

不起作用。 repo-a 中的其他目录消失了。此外,我无法从本地 repo-a 拉到 repo-b:我收到错误 >> 致命:拒绝合并不相关的历史 我刚读完你提到的参考资料,也读了 cmets。所有这些总是导致相同的错误并且它总是发生在同一个步骤(拉步骤)$致命:拒绝合并不相关的历史 是的,在第一个命令之后,你会发现 RepoA 只有包含在子文件夹中的文件现在位于 RepoA 的根目录中。这就是第二条和第三条命令的原因:再次将文件放入子文件夹中。对于 git pull 步骤,你可以试试git pull RepoA master --allow-unrelated-histories 这可能意味着什么?您知道我是否应该担心此存储库中将来可能发生的事情吗?任何历史冲突之类的。 这是因为您的 RepoA 和 RepoB 没有相关的提交、文件或历史记录。当你真正想拉取或合并时,获取fatal: refusing to merge unrelated histories的信息并不重要,只需添加--allow-unrelated-histories即可。

以上是关于如何在维护与这些文件关联的提交的同时将文件从 RepoA 导入到 RepoB?的主要内容,如果未能解决你的问题,请参考以下文章

应用商店提交“请使用与团队 ID 关联的配置文件......” [关闭]

gitlab本地创建空文件,之后关联仓库提交文件...

将本地新工程与 git 关联

如何从提交清单 Android Studio 中删除一些文件?

将文件与另一个提交中的另一个文件进行比较

如何同时关联多个网上仓库,实现一次`push`多站提交(github + gitee)