有一个文件被跟踪 git
,但现在文件在 .gitignore
名单。
但是,该文件不断出现 git status
经过编辑。你怎么用力 git
彻底忘掉它?
有一个文件被跟踪 git
,但现在文件在 .gitignore
名单。
但是,该文件不断出现 git status
经过编辑。你怎么用力 git
彻底忘掉它?
.gitignore
将阻止添加未跟踪的文件(没有 add -f
)到git跟踪的文件集,但git将继续跟踪任何已被跟踪的文件。
要停止跟踪文件,您需要将其从索引中删除。这可以通过此命令实现。
git rm --cached <file>
从头修订中删除文件将在下次提交时发生。
下面的一系列命令将从Git索引中删除所有项目(而不是从工作目录或本地存储库中删除),然后更新Git索引,同时遵守git忽略。 PS。索引=缓存
第一:
git rm -r --cached .
git add .
然后:
git commit -am "Remove ignored files"
git update-index 为我做的工作:
git update-index --assume-unchanged <file>
注意: 这个解决方案实际上是独立的 .gitignore
因为gitignore仅适用于未跟踪的文件。
编辑: 由于此答案已过帐,因此创建了一个新选项,应该首选。你应该用 --skip-worktree
这是用于不再需要提交并保留的已修改跟踪文件 --assume-unchanged
用于防止git检查大型跟踪文件状态的性能。看到 https://stackoverflow.com/a/13631525/717372 更多细节...
git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"
这将获取被忽略文件的列表并将其从索引中删除,然后提交更改。
我总是使用此命令删除那些未跟踪的文件。 单行,Unix风格,干净的输出:
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached
它列出了所有被忽略的文件,用引用的行替换每个输出行,而不是处理内部有空格的路径,并将所有内容传递给 git rm -r --cached
从索引中删除路径/文件/目录。
如果你不能 git rm
跟踪文件,因为其他人可能需要它(警告,即使 您 git rm --cached
,当其他人得到此更改时,他们的文件将在其文件系统中删除)请查看 https://gist.github.com/1423106 了解人们解决问题的方法。
将它移出,提交,然后将其移回。这在过去对我有用。实现这一目标可能有一种“轻微”的方式。
(在Linux下),我想在这里使用帖子提示 ls-files --ignored --exclude-standard | xargs git rm -r --cached
做法。但是,(某些)要删除的文件有嵌入式换行符/ LF /\n
在他们的名字。两种解决方案都没有:
git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached
应对这种情况(获取有关未找到文件的错误)。
git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
这使用了 -z
论证 LS-文件,和 -0
论证 xargs的 安全/正确地迎合文件名中的“讨厌”字符。
在手册页中 GIT-LS-文件(1), 它指出:
如果未使用-z选项,则使用TAB,LF和反斜杠字符 路径名分别表示为\ t,\ n和\\。
所以如果文件名中包含任何这些字符,我认为我的解决方案是必需的。
编辑:我被要求添加 - 像任何一样 git rm
命令---必须跟着一个 承诺 使删除永久化,例如 git commit -am "Remove ignored files"
。