获取两个不同 git 存储库中文件的差异并应用于第一个存储库
get diff between files in two different git repos and apply to first repo
我有两个不同的本地 git 存储库,我们称之为 a
和 b
。它们都在我的主目录的 projects
文件夹中。我想在两个回购协议中的特定文件之间获得差异,我们称之为 foo
,并将该差异应用到 a
.
如果我 运行 git diff ./foo ../b/foo > diff.diff
从内部 a
我可以查看差异并确认它包含我想要应用的更改,但是当我 运行 git apply diff.diff
然后我得到这个错误:
fatal: invalid path './foo'
如果我尝试 运行ning git diff ~/projects/a/foo ~/projects/b/foo > diff.diff
,那么当我尝试应用差异时,我会收到此错误:
error: home/ryan/projects/a/foo: No such file or directory
现在,我只需复制文件即可获得与应用差异相同的效果,但是否有充分的理由说明这不起作用?
要比较回购 a
和回购 b
之间的 foo
文件并将更改应用到回购 a
,您只需要使用以下命令:
# In ~/projects/a (local repo a)
git remote add repob ~/projects/b -f
git diff master repob/master -- foo > diff.patch
git apply diff.patch
现在 repo a
中的 foo
更改为 repo b
的版本。然后你可以提交并推送:
git add foo
git commit -m 'change foo as the version in repo b'
git push
首先,git diff
在这里没有给你买任何东西——你还不如使用普通的 diff -u
。补丁不适用的原因是 git-apply
被 diff 中不一致的文件路径弄糊涂了。要解决此问题,您需要设置工作目录,以便 diff 中的相对路径对于文件的两个版本具有相同深度。在这里,我将目录更改为两个项目目录的共同父目录:
cd ~/projects
diff -u a/foo b/foo >a/diff.patch
cd a
patch -p1 <diff.patch
git add ... commit ... etc ...
我有两个不同的本地 git 存储库,我们称之为 a
和 b
。它们都在我的主目录的 projects
文件夹中。我想在两个回购协议中的特定文件之间获得差异,我们称之为 foo
,并将该差异应用到 a
.
如果我 运行 git diff ./foo ../b/foo > diff.diff
从内部 a
我可以查看差异并确认它包含我想要应用的更改,但是当我 运行 git apply diff.diff
然后我得到这个错误:
fatal: invalid path './foo'
如果我尝试 运行ning git diff ~/projects/a/foo ~/projects/b/foo > diff.diff
,那么当我尝试应用差异时,我会收到此错误:
error: home/ryan/projects/a/foo: No such file or directory
现在,我只需复制文件即可获得与应用差异相同的效果,但是否有充分的理由说明这不起作用?
要比较回购 a
和回购 b
之间的 foo
文件并将更改应用到回购 a
,您只需要使用以下命令:
# In ~/projects/a (local repo a)
git remote add repob ~/projects/b -f
git diff master repob/master -- foo > diff.patch
git apply diff.patch
现在 repo a
中的 foo
更改为 repo b
的版本。然后你可以提交并推送:
git add foo
git commit -m 'change foo as the version in repo b'
git push
首先,git diff
在这里没有给你买任何东西——你还不如使用普通的 diff -u
。补丁不适用的原因是 git-apply
被 diff 中不一致的文件路径弄糊涂了。要解决此问题,您需要设置工作目录,以便 diff 中的相对路径对于文件的两个版本具有相同深度。在这里,我将目录更改为两个项目目录的共同父目录:
cd ~/projects
diff -u a/foo b/foo >a/diff.patch
cd a
patch -p1 <diff.patch
git add ... commit ... etc ...