情况
团队成员上传了node_modules,以及.gitignore。
但是为了不影响别人使用,我又不能直接删了这些。
尝试的方法(失败)
git update-index?
使用下面的代码可以让某个文件的修改不被追踪
# 移除追踪 git update-index --assume-unchanged <fileName>
git update-index --assume-unchanged .gitignore
# 恢复追踪
git update-index --no-assume-unchanged .gitignore
但是有很多缺点,因此这个命令几乎没有用。
- 指定目录没有效果(设计上就没有想过要指定目录)
- 使用git stash后文件会还原到未变更的状态,然而pop之后,文件的更改并没有回来。
由于没有追踪他的变更,导致stash没有存储他的变更,直接清除掉了。
.gitignore?
.gitignore对于先前未存在的文件是有用的,然而如果已经存在了就会出现问题
比如我们把.env.sit加到.gitignore中,然后移除追踪。
# 移除追踪 git rm -r --cached <fileName>
git rm -r --cached .env.sit
可以发现,变成删除了
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: .env.sit
权宜之计
在更新或者推送前,使用git stash保存本地代码情况。
等更新完毕后,使用git stash pop恢复本地更改。
不能使用git add .。
# 示例如下
git add a.txt
git add c.txt
git stash
# 拉取和推送(git中是git pull+git push)
git svn fetch
git svn rebase
git svn dcommit
# 恢复本地代码
git stash pop
评价
git没有想到会存在这种情况,因为如果要忽略某个文件,为什么不从远程删除呢。
但是实际上又存在这种情况,人家上传了不该上传的代码(node_modules),为了不影响别人使用,你又不能删除这些代码。
项目中是存在.gitignore的,但是人家用的纯血svn,甚至想逼我使用svn而不是git。