9

我有两个单独的 git 存储库:A 和 B。一些存储库 B 文件已经存在于项目 A 的子文件夹中。我的目标是为存储库 B 创建补丁,然后将它们应用到存储库 A 中的子文件夹以保存存储库 B 的历史记录在合并它们时。问题是补丁无法创建新文件。例如:

假设这个文件夹结构: /home/user/B/..bunch 目录和 /home/user/A/ext/lib/B/..bunch 目录

cd /home/user/B

git format-patch "xx..xx" -o /home/user/A/ (创建补丁文件)

cd /home/user/A

git apply -v --directory=ext/lib/B/0001-foo-12345.patch

工作正常,因为补丁没有创建任何新文件或尝试访问 B 中存在但 A 中不存在的文件夹

cd /home/user/A

git apply -v --directory=ext/lib/B/0002-foo2-6789.patch

不起作用并抛出此错误:检查补丁 ext/lib/B/xyz/test.c... 错误:ext/lib/B/xyz/test.c:没有这样的文件或目录。

到目前为止,我已经尝试了以下命令:

git apply -v --directory=/home/user/A/lib/B/ --include=bb/cc --exclude=cc/ --exclude=bb/ --include=* 0002-foo2-6789.patch

git apply -v --directory=/home/user/A/lib/B/ --include=* --include=bb/cc --exclude=cc/ --exclude=bb/ 0002-foo2-6789.patch

git am --directory=/home/user/A/lib/B/ --include=* --include=bb/cc --exclude=cc/ --exclude=bb/ 0002-foo2-6789.patch

4

1 回答 1

1

有多种方法可以创建将创建新文件的补丁文件。但是,在存储库 B 中创建补丁并在存储库 A 中应用它们不会将存储库 B 的历史记录导入存储库 A。这就是您所说的“在合并它们的同时保留存储库 B 的历史记录”的意思吗?

导致git apply创建新路径的示例补丁:

diff --git a/b1.txt b/b1.txt
new file mode 100644            <-- lines specific to creating new files
index 0000000..12f00e9
--- /dev/null                   <-- lines specific to creating new files
+++ b/b1.txt
@@ -0,0 +1 @@
+contents

像这样创建补丁的一种方法是将文件从 repo B 复制到 repo A 中的目标位置,git add任何更改或新文件,然后用于git diff --staged > my.patch为所有更改和新文件创建补丁。然而,到那时,这些文件已经在 repo A 中,所以创建这样的补丁没有什么意义,而且这也不会将 repo B 的历史导入 repo A。

如果您真的想将 repo B 合并到 repo A 的子目录中并保留两者的历史记录,最好不要使用补丁并在此处查看前几个答案:如何合并两个 Git 存储库?

于 2021-06-12T13:13:19.670 回答