我目前正在重构一些Angular组件并为我们的预订确认屏幕更新其样式。 我的同事马特(Matt)向我展示了一种方便的方法,可以手动将大物体粘贴到相关的模型文件中,这样我就可以直接进入预订确认屏幕,而无需单击整个搜索/价格/预订过程。 但是,现在每次执行git status ,都会得到:
真烦人 在版本控制的意义上,实际上并没有修改那个“修改过的”文件-我不打算以后再提交更改并将其推送到上游存储库中。 在执行git status时,我不想看到它,尤其是当执行git add时,我不想git add更改。
因此,我找到了一种解决此问题的巧妙方法。
-
git update-index --skip-worktree src/app/price/confirmation/confirmation-model.js将“隐藏”来自Git的文件; 它将不再显示为我已更改的文件。 如果文件被远程更改并且我执行git pull,Git会给我一个冲突消息,并说明解决该问题需要做的事情。git reset --hard不会重置文件,从而使更改可以保留很长时间(例如,跨分支)。 - 要查看以这种方式隐藏的所有文件的列表,我可以执行
git ls-files -v . | grep ^Sgit ls-files -v . | grep ^Sgit ls-files -v . | grep ^S将显示状态码为S所有文件(对于skip-worktree)。 - 要“取消隐藏”文件,我可以简单地执行
git update-index --no-skip-worktree src/app/price/confirmation/confirmation-model.js。
这与.gitignore有何不同?
“隐藏”文件的最常见方法是将它们添加到.gitignore 。 这对我不起作用:我正在编辑的文件已经在Git中进行了跟踪,这意味着更改仍将以git status显示。
.gitignore用于构建构件之类的东西,这些构件根本不应该提交给仓库。
假定不变,这有何不同?
现在我们到了某个地方! git update-index --assume-unchanged在功能上与--skip-worktree非常相似。 区别在于- --assume-unchanged似乎是为性能目的而设计的,而不是为配置等的本地覆盖而设计的。 它用于检查文件更改非常昂贵的情况。 至关重要的是,诸如git pull类的操作很可能会重置此标志并放弃所有更改,而没有恢复它们的选项。
提示
如果计划使用这些,建议您向.zshrc / .bashrc文件中添加一些别名:
然后,您可以执行ghide path/to/file隐藏, gunhide path/to/file取消隐藏, ghidden列出所有隐藏文件。
希望这个对你有帮助! 请记住,如果您要使用此功能,只需经常检查自己是否没有忘记隐藏文件。 (我仍在寻找一种聪明的方式来显示git status ……)
更新(2017-09-14)
我不知道为什么我以前没有想到这个! 比使这些命令成为外壳别名更好,您可以将它们直接放在Git配置( ~/.gitconfig )中。 这会将命令“范围”化到Git,从而允许Git自动完成命令,例如使命令类似于标准Git命令。 这也意味着这些命令将跨多个外壳提供给您。
然后,这些命令变为git hide path/to/file , git unhide path/to/file和git hidden 。