在我的本地分支上,我对Makefile进行了一些个人(仅限本地)更改(只是更改了编译器的路径)。显然我不想提交这些更改,因为它们只与我有关。但是,如果我不提交它们,那么当我尝试与远程分支同步时出现错误:
% git fetch upstream
% git merge upstream/master
error: Your local changes to 'Makefile' would be overwritten by merge. Aborting.
Please, commit your changes or stash them before you can merge.
每次发生这种情况时存储然后取消存储文件似乎很乏味。例如,在Perforce上,您只需将这些文件移动到单独的更改列表中,并在必要时解决合并冲突。
我想要发生的是让git自动将我的本地Makefile与远程的Makefile合并(如果可能),但不必提交它。我怎么会这样做?
答案 0 :(得分:8)
有几种方法可以解决这个问题,这是我的想法。
创建一个新的makefix
分支并在那里提交makefile。每当您需要创建项目时,请切换到该分支。您可以在master
中工作,只是继续合并,或者针对makefix
重新定位master
分支。
一般的想法是,您正在创建一个包含永不推送的Makefile
的分支。
就我个人而言,我会针对makefix
重新master
,因此我的Makefile
更改始终领先于实际的可推送代码。它只是感觉更清洁。
git branch makefix
git checkout makefix
对Makefile
git add Makefile
git commit -m "Add Local Makefile Changes to Compiler Path"
每日工作
git checkout master
git fetch upstream
git merge upstream/master
git checkout makefix
git rebase master
它长而丑,所以我希望别人有更好的方式=]
答案 1 :(得分:2)
让git自动执行rebase可能更容易,即创建本地分支,配置rebase,添加更改,拉动......
git checkout -b mybranch origin/master
git config branch.mybranch.rebase true
根据您的需要调整Makefile ...
git add Makefile
git commit -m 'My local-only Makefile.'
从现在开始,git会根据
重新定义您的更改git pull
或者,(特别是如果你没有选择rebase)你可以创建一个要使用的常规Makefile和gitignore的副本:
cp Makefile Makefile.local
echo Makefile.local >> .git/info/exclude
make -f Makefile.local
但是,使用该变体时,您需要密切关注(常规,git控制的)Makefile,并在必要时相应地更新本地版本。
答案 2 :(得分:1)
为什么不修改Makefile以使用变量来获取编译器的路径而不是硬编码的东西?然后,您可以在您的环境中设置适当的值。很多这些(如C编译器的CC,C预处理器的CPP等,都是由make预先设置的)。如果不是,则可以为其提供可由环境变量覆盖的默认值。这个例子假设GNU make,其他make实用程序允许类似的解决方案:
FOO ?= /usr/bin/foo
test:
@echo CC is ${CC}
@echo FOO is ${FOO}
(确保使用真正的标签)。
这给出了:
$ make
CC is cc
FOO is /usr/bin/foo
$ export FOO=/opt/bin/foo
$ make
CC is cc
FOO is /opt/bin/foo
$ make FOO=/just/this/once
CC is cc
FOO is /just/this/once
这是一个更易于维护的解决方案,并且避免了有一天意外推送上游本地更改的风险。