我找到了一种方法,可以让git在不要求你stash的情况下,将你认为在.gitignore中安全的文件静默删除。
即使你使用了相同的忽略文件自初始提交以来,这种情况仍然存在。
当你处于一个已经删除了此文件但在.gitignore中列出的提交中,并且你检出了另一个存在此文件的提交时,就会出现问题。
git init
mkdir ignored/
echo stuff > ignored/file
echo otherstuff > otherfile
git add -A
# Opps added my ignored folders files
# Forgeting to rm --cache
echo ignored/ > .gitignore ; git add .gitignore
git commit -m 'accidentally add ignored/file'
git status
touch dummyfile; git add dummyfile
# Remembered to rm --cache
git rm --cache -rf ignored/file #This file is now vulnerable to clobber
git commit -m 'add stuff'
echo somechange >> ignored/file
## Wait for it..
git checkout HEAD~
## somechange has been silently clobbered!!
# Please paste first paragraph, observe and then past the second.
# Note both commits have the correct ignore file and are not immune!
(将上述代码粘贴到终端之前,请先转到空文件夹)
有没有什么办法可以防止这种静默覆盖?
.git<feelFreeToClobberThese>ignore
,通常情况下,当您检出提交时,Git 浮动工作会跨越这个文件。很多人依赖它(而不应该)。 - sabgenton.gitprecious
,并在其中列出不应该被删除的文件。这会使git checkout
的工作变得复杂,它现在必须首先提取目标提交的“宝贵列表”,然后决定哪些文件可以被覆盖,但它将提供一种救生圈。 - torek--skip-worktree
不是更适合使用吗?我认为--assume-unchanged
应该是用于文件当前未更改的情况下。 - sabgentonCE_REMOVE
条目被写回索引文件。当然我现在无法再现它,但除了比特本身之外,我还记得某种可观察行为表明索引条目仍然存在。 - torek