git中如何不追踪先前已经存在的文件?

76 阅读2分钟

情况

团队成员上传了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

但是有很多缺点,因此这个命令几乎没有用。

  1. 指定目录没有效果(设计上就没有想过要指定目录)
  2. 使用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。