sid*_*d99 9 git bash git-am git-apply
我有两个单独的 git 存储库:A 和 B。一些存储库 B 文件已经存在于项目 A 的子文件夹中。我的目标是为存储库 B 创建补丁,然后将它们应用到存储库 A 中的子文件夹以保存存储库 B 的历史记录在合并它们的同时。问题是补丁无法创建新文件。例如:
假设此文件夹结构:/home/user/B/..bunch 目录和 /home/user/A/ext/lib/B/..bunch 目录
cd /home/用户/B
git format-patch "xx..xx" -o /home/user/A/ (创建补丁文件)
cd /home/用户/A
git apply -v --directory=ext/lib/B/ 0001-foo-12345.patch
工作正常,因为补丁没有创建任何新文件或尝试访问 B 中存在但 A 中不存在的文件夹
但
cd /home/用户/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
有多种方法可以创建将创建新文件的补丁文件。但是,在存储库 B 中创建补丁并在存储库 A 中应用它们不会将存储库 B 的历史导入到存储库 A 中。这就是您所说的“在合并存储库 B 时保留存储库 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
Run Code Online (Sandbox Code Playgroud)
创建此类补丁的一种方法是将文件从存储库 B 复制到存储库 A 中的目标(git add任何已更改或新文件),然后用于git diff --staged > my.patch为所有已更改和新文件创建补丁。然而,到那时,这些文件已经在存储库 A 中,因此创建这样的补丁没有什么意义,而且这也不会将存储库 B 的历史记录导入到存储库 A 中。
如果您确实想将存储库 B 合并到存储库 A 的子目录中并保留两者的历史记录,那么最好不要使用补丁并查看此处的前几个答案:如何合并两个 Git 存储库?