在git中,如何从上游源(即原始项目)中提取某些文件?
我有一个我正在研究的项目,它最初是从一个非常活跃的存储库中分叉出来的。我已经将原始文件添加为名为“上游”的远程程序,以便可以运行:
git pull upstream
并将项目更新为最近的提交。
问题:有些文件(例如我的Gruntfile.js
)我不想在原始项目旁边更新。每当我提交这些提交时,我都会遇到合并冲突,因为我已经更改了我自己版本中的文件。
我确实想要为我自己的本地提交跟踪这些文件,并从我自己的来源提取更改,因此永久性地将这些文件添加到.gitignore
不是一种选择。
我目前的解决方案是让一个繁琐的任务临时添加Gruntfile.js
和其他人.gitignore
,从上游拉,然后从.gitignore
删除它们,以便我可以跟踪自己的更改并推动我的起源。然而,这感觉很糟糕。
有什么办法可以在从“上游”拉出来时忽略这些文件吗?
答案 0 :(得分:8)
是的,你可以做到。
git pull是git fetch的简写,后跟git merge FETCH_HEAD
首先你可以做一个,
git fetch upstream
接着,
git merge --no-log --no-ff --no-commit upstream/branch
Git将在提交前停止。因此,您应该能够修改合并,并排除所需的文件。
<强>更新强>
可以使用git别名组合命令。
在〜/ .gitconfig
中创建一个别名[alias]
fnm = !git fetch upstream && git merge --no-log --no-ff --no-commit upstream/branch
您可以进一步添加,
[alias]
fnm = !git fetch upstream && git merge --no-log --no-ff --no-commit upstream/branch && git reset file/path/not/to/be/updated && git checkout file/path/not/to/be/updated
使用git fnm
进行完整操作。
答案 1 :(得分:1)
然而,这感觉很糟糕
一种不太常见的方法可能是避免在想要更新时保留文件的分叉版本。我不知道您的更改是什么,但是如果您的修改提出合并请求呢?
如果你的修改是个人的(例如:本地网址),那么在你引入本地配置文件的情况下提出合并请求呢?
例如https://github.com/fabelier/Doorbell所做的事情:它提供了一个默认使用的config.js.template文件,但是用户可以提供config.js
文件来添加他们的文件自己的特点;并且这个文件没有保存在Git中。