git停止追踪文件-最佳实践
有时候我们会遇到这样的场景,失误或是不小心将IDE的一些配置文件(如.idea文件夹)推送到了git仓库.而且你的同事拉取了代码,那么无论他们修改配置文件还是修复路径,他们:
要么提交上去,谁拉代码谁冲突
要么不提,,每次提交的时候小心翼翼不把这些配置文件提上去
为什么.gitignore文件不管用?
也许这时你马上会想,"shit,最好马上把这些文件添加到.gitignore".然后你就做了,结果坑爹的发现:那些已经被添加到仓库的文件,只要修改就会出现在被修改的列表里,根本不管用
这是因为.gitignore的设计就是为了那些没有被追踪的文件(即不在仓库中),如果你将一个已经被追踪的文件添加到.gitignore文件(或者使用add -f强制添加),这个文件还是会像工程里的其他文件一样被追踪的
把文件从仓库当中删除?
那么接下来你还可以尝试将文件从仓库中删除,那么git就不会再追踪这个文件而且可以加到.gitignore文件.
然而,你要如何把文件仅仅从git仓库中删掉呢?因为你不想丢失IDE的项目配置文件(丢了还怎么运行).这些文件应该保留在你的机器上,就像"不提交"它.
(当然你也不能把他们从git仓库中删掉,然后拿着这些文件到处拷贝覆盖,不要自欺欺人了)
其实还有一种方案 git rm --cached filename
这种方法确实可以把文件从暂存里移除掉怎么修改也看不到,就好像真的从硬盘上删除了一样,所以你就简单地运行 git rm -r --cached .idea
提交,然后搞定,是吗?
错!
怎么才能不被同事鄙视
去搜索的话,你会发现还有一种说法是这样的,而且无耻的度娘全都是这个结果:
git update-index --assume-unchanged filename
.这方法确实很有效果,怎么修改都不会看到,但跟前面的一些方法一样,自欺欺人,治标不治本:
因为是本地设置,所以每个同事只要新拉的代码,都要这么配置
你停止追踪了这些文件并提交上去,git本地仓库并不知道你保留了这些文件,.所以同事们去拉代码的时候,他们机子上的git就会愉快地将那些文件删除掉,然后他们的IDE就shit了.那要怎么防止git这么做呢?
好吧,说实话,做不到.你提交的删除操作会导致git去删除掉每个同事机子上的那些文件.
除非...除非你可以在git之前那样做
在git之前删除
如果另外一个开发者在拉取你的修改之前执行git rm -r --cached .idea
然后提交到本地仓库,git发现这两个操作是等价的,就不会去尝试删除了
所以,这就是第一种做法. 告诉你同事你将在下午三点对这些文件停止追踪,然后他们在拉取你的修改之前也进行同样的操作(首先确保这些文件被加到了.gitignore中).但是,万一这没有生效或是有人没收到通知,那这里还有第二种方案.
把文件还原回来
如果文件在机器上被删除了,应该可以很简单地还原回来,毕竟这才是版本控制
git checkout <tree-ish> <file(s)>
命令可以使git恢复任何文件在任何时间点的版本.所以如果你的上一次提交使同事本地的那些文件被删除掉了,他可以简单地利用git checkout HEAD^ .idea
命令从之前的版本恢复.如果这之间有不止一次提交,那么首先找到文件被删掉的那次提交(git log --stat --diff-filter=D
可能会用到),然后恢复这次提交之前的最近一个版本.例如,删除的那次提交是c4f3d00d
,那就使用git checkout caf3d00d~1 .idea
.
但是稍等,还有一个非常关键的步骤~
因为当你使用git checkout
还原文件时,git会把文件加到追踪并放到暂存.没错,即使已经被加到了.gitignore(当然并没有哪条命令可以防止git这样处理).也就是说,如果你一不小心,会再次把这些文件提交到仓库!
幸运的是,有个非常简单的做法.在你把文件还原之后,一切都没有问题了,执行git reset HEAD .idea
,由于这些文件已经被添加到了.gitignore(你已经把它加进去了,不是么?),git不会再把它加进去了
网友评论