如何拉取除一个文件外的所有文件?

9
我想拉取除一个文件(下面是GNUmakefile)之外的所有更改。我查看了git-pull(3)手册,但该选项对我来说不太清晰。

如何拉取所有更改,但跳过导致git出现问题的文件?是否有“忽略冲突文件”或“忽略文件X”等选项?

(最糟糕的是,GNUmakefile在虚拟机之间被复制/粘贴,因此它们几乎是相同的文件。cryptopp-rw的makefile在其末尾添加了一些依赖关系配方。)

cryptopp-rw$ git pull
remote: Counting objects: 7, done.
remote: Total 7 (delta 4), reused 4 (delta 4), pack-reused 3
Unpacking objects: 100% (7/7), done.
From https://github.com/weidai11/cryptopp
   4206b4a..cf08f3e  master     -> origin/master
Updating 4206b4a..cf08f3e
error: Your local changes to the following files would be overwritten by merge:
    GNUmakefile
Please, commit your changes or stash them before you can merge.
Aborting

2
将文件暂存 (git stash),然后用git stash apply将其放回拉取中。解决任何合并冲突。 - FDinoff
1
感谢@FDinoff。这是过程中多了两个步骤。难道没有办法在0步骤(使用选项)中完成吗?我还不如直接从命令行使用mv,这样就不需要阅读手册或与源代码控制工具打交道了。 - jww
1
git fetch(以及扩展的git pull)是针对提交而不是文件进行操作的。它没有涉及个别文件的任何选项。 - Chris
2个回答

6
你可以将当前工作区储存起来,然后再执行拉取操作,这样可以避免Git抛出错误并取消进程。拉取完成后,你可以使用以下命令恢复储存的文件:
git stash pop stash@{<revision>}

如果这个解决方案需要一些额外的步骤,而你想要避免它们,你可以通过覆盖已经在git仓库中的文件来忽略那些引起问题的文件:

git checkout HEAD^ file/to/overwrite
git pull

或者您可以尝试使用-f命令进行拉取:

git pull -f

1
考虑到即使使用git update-index --skip-worktree也无法阻止git pull更新那个文件,你只能使用一个解决方法:
  • 创建一个别名'gpu'并调用一个脚本
  • 编写一个脚本,将该文件保存在其他位置,执行git pull,然后用保存的文件覆盖该文件(这样就不需要从stash pop中解决冲突)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接