在两个不同的git仓库中获取文件差异并适用于第一个仓库

问题描述:

我有两个不同的本地仓库仓库,我们称之为ab。它们都位于我的主目录中的projects文件夹中。我想在两个回购中的特定文件之间获得差异,我们将其称为foo,并将该差异应用于a在两个不同的git仓库中获取文件差异并适用于第一个仓库

,如果我从内a运行git diff ./foo ../b/foo > diff.diff我可以看看diff和确认它包含我想申请的变化,但是当我运行git apply diff.diff然后我得到这个错误:

fatal: invalid path './foo' 

如果我尝试运行git diff ~/projects/a/foo ~/projects/b/foo > diff.diff,然后当我尝试应用DIFF我得到这个错误:

error: home/ryan/projects/a/foo: No such file or directory 

现在,我可以只复制文件,以获取作为应用DIFF同样的效果,但有一个很好的理由,为什么这ISN没有工作?

+0

您只能在单个回购协议中混用差异。但是你可以只运行'diff'。要将'diff'的输出用于'git apply',请使用'diff -u'作为unidiff格式。 – Mort

+0

我刚刚试过使用相对路径,并且它成功地产生了一个差异,但是我得到了一个类似的'没有这样的文件或目录'错误。 – Ryan1729

比较回购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 

现在回购的fooa变化回购b版本。然后你就可以提交并推送:

所有的
git add foo 
git commit -m 'change foo as the version in repo b' 
git push 
+0

也许我错过了一些东西,但是看起来它只是做一个diff,并将diff文件本身提交到repo。这实际上是否应用差异? – Ryan1729

+0

好的,我更新了我的答案。然后,它实际上会将从库存'b'更改'foo'应用到库存a。 –

+0

我觉得奇怪的是,添加遥控器是必需的,但我试过了,它工作!这会将diff保留在'a'目录中,所以可能需要使用'/ tmp/diff.patch'。 – Ryan1729

首先,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 ...