在两个不同的git仓库中获取文件差异并适用于第一个仓库
问题描述:
我有两个不同的本地仓库仓库,我们称之为a
和b
。它们都位于我的主目录中的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没有工作?
答
比较回购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
现在回购的foo
a
变化回购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 ...
您只能在单个回购协议中混用差异。但是你可以只运行'diff'。要将'diff'的输出用于'git apply',请使用'diff -u'作为unidiff格式。 – Mort
我刚刚试过使用相对路径,并且它成功地产生了一个差异,但是我得到了一个类似的'没有这样的文件或目录'错误。 – Ryan1729