2017-04-17 88 views
0

我希望我的项目中的特定配置文件在本地环境中具有不同于config的环境,而且我不想更改或隐藏/每次我的东西推到主存储库是否git'skipworktree'阻止文件从git pull更新

时间,我发现,使用弹出文件:

git update-index --skip-worktree <file> 

让我这样做。

虽然我有一个问题,在其他人更改配置文件并将更改推送到主存储库的场景中,下次我将更改导入到本地配置文件时,会更新该配置文件吗?

+0

它不,但[设置稀疏结帐呢](https://stackoverflow.com/a/37066742/2303202) – max630

回答

1

如果配置文件是没用的,做版本控制(因为你需要配置不同的地方),你最好忽略该文件中.gitignore

touch .gitignore 
echo <file> >> .gitignore 
git rm <file> --cached 
git add . 
git commit -m 'message' 
git push 

之所以不如下使用git update-index --skip-worktree <file>

  • 配置文件没有在本地更改,但只在远程更新,当您执行git pull时,配置文件将更新为远程。
  • 在本地和远程都变了,当你执行git pull,git会检测到冲突和配置文件显示错误为:
error: Your local changes to the following files would be overwritten by merge: 
     file 
Please commit your changes or stash them before you merge. 
Aborting 
  • 的配置文件仅在局部改变,当你想结账其他分支,git会显示
error: Your local changes to the following files would be overwritten by checkout: 
     file 
Please commit your changes or stash them before you switch branches. 
Aborting 
  • git update-index --skip-worktree通常用于临时使用。

您还可以比较使用git update-index --skip-worktreehere

+0

感谢您的详细解答,这让我感到困惑,因为我曾经假设将文件标记为skip-worktree会使其被git pull和branch checkout忽略。 如果是这种情况,我不明白git update-index的用途--skip-worktree – Snedden27

+0

Skip-worktree假装它的工作目录版本是最新的,而是读取索引版本。但是当你使用'git pull'或'git checkout branch'时,当前的索引正试图放弃,所以skip-worktree将停止工作。 –

0

这里的文档有点不清楚;在我的测试中(使用版本2.12.0.windows.1)如果远程包含我标记为--skip-worktree的文件的更改,则无法拉动。 (我得到了覆盖本地修改的操作的常见错误,我尝试了各种方法来解决这个问题,但唯一有效的方法是清除skip-worktree位,这当然会让你回到保护当地的变化。)

我个人认为这个解决方案非常混乱。 (a)特定于环境的设置不受源代码控制(即存储在.gitignore覆盖的路径或存储在回购站之外的路径),或者(b)您保留每个环境的文件版本而选择“主动”的方式不受源控制。

+0

我不能gitignore该文件。 现在我正在存储我的本地文件,所有的东西都拉出来,一旦拉出来就弹出存储回来。但我希望我能以更简单的方式做到这一点 – Snedden27

+0

好吧,如果您坚持依靠手动程序来避免提交您认为是本地的更改,那么只能是两次失败之间的时间问题。哦,但你足够好,永远不会犯错误?凉。是否每个人都与你一起工作(或永远)?看,我不在乎你在回购中做了什么,但是不要问一个问题,然后嗤之以鼻什么是处理问题的正确方法。 (您是否注意到其他答案实际上给出了完全相同的建议?) –