从git中暂时取消跟踪文件

552

我在本地机器上设置了Git。在初始化Git时,我添加了预编译的库和二进制文件。然而,在我的开发过程中,我不想时断时续地检查这些文件。我不想从仓库中删除这些文件。是否有任何方法可以在完成开发之前暂时停止跟踪这些文件。(我认为我不能使用.gitignore,因为它只适用于那些没有被Git跟踪的文件。我想临时禁用文件的跟踪。)


相关问题:https://dev59.com/H3NA5IYBdhLWcg3wgeEd - CharlesB
10个回答

867

git update-index 可以满足你的需求。

这将告诉 git 你希望开始忽略文件的更改:
git update-index --assume-unchanged path/to/file

当你想再次跟踪时:
git update-index --no-assume-unchanged path/to/file

Github 文档:update-index


4
终于有一个命令可以有效地处理我误提交的开发文件了,谢谢 :) - Richard de Wit
18
为什么不使用 "git rm -r --cached <file>" 命令? - Dr. Ehsan Ali
28
@Ehsan,似乎git rm --cached会导致其他机器上的本地副本被删除,这些机器上检出了相同的分支,并在下一次拉取时执行。请参阅http://www.arlocarreon.com/blog/git/untrack-files-in-git-repos-without-deleting-them/,特别是其下面的讨论。 - mit
3
对我来说不起作用,当我对文件进行更改时,更改仍然会被添加到包含的更改中。我可以进行排除,但在某些时候它可能会被意外地添加进去。 - MrFox
12
assume-unchanged 命令不是用来达到这个目的的。建议阅读这个 线程 - Appy
显示剩余5条评论

350

之后,您可以将文件保持未被跟踪状态

git rm -r --cached <file>

使用以下方式添加您的文件

git add -u

他们推动或者做任何你想要的事情。


25
根据https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository,那实际上是正确答案。 - Dr. Ehsan Ali
1
git rm --cached .DS_Store 然后它会打印出 rm '../.DS_Store',这个本地文件就被删除了?! (git version 2.6.4 (Apple Git-63)) - Weishi Z
-r标志递归地将文件从索引中撤销并删除;工作树保持不变。 - cajuuh
10
这不是正确的答案,因为这将会在源中移除该文件。原帖想要忽略该文件的本地改动,而不是完全取消对该文件的跟踪。 - cjsimon
6
警告:这将同时删除您想要取消跟踪的文件。解决方法是将所有文件复制到其他地方,在提交后再将它们复制回来。 - psad
显示剩余3条评论

117
git rm --cached

然而,你不应该在第一次提交时将编译后的二进制文件和外部依赖项提交。相反,使用像Bundler这样的工具来拉取它们。


4
不要忘记对目录使用 -r 选项(递归):git rm -r --cached - Anatolii Shuba

64

使用以下命令取消跟踪文件

git rm --cached <file path>

12

这并不是对原问题的回答,但可能会对某些人有所帮助。

要查看您所做的更改(了解标记为--assume-unchanged的文件)

git ls-files -v

生成的文件列表将有一个带有一个字符前缀(例如:H或h)。 如果是小写字母(即h),则该文件被标记为--assume-unchanged。


3
使用命令 git ls-files -v | grep "^h " 可以查看所有被 --assume-unchanged 的文件。 - ZX9
1
如果你需要更加Windows友好的方式:powershell "git ls-files -v |? {$_ -cmatch '^h '}" 应该能解决问题。 - ZX9

8
在git-book的第2.4节“撤销操作”中提到了这一点。基本上,你需要将某些文件的索引状态重置为HEAD状态,也就是最新检出(或提交)的状态。这将撤销将文件暂存到当前索引的操作。执行此任务的命令是git reset。因此,你需要执行以下命令:
git reset HEAD /path/to/file

较新版本的git(我相信从1.6开始)在执行git status时会给出此命令(以及许多其他命令)作为提示。这些版本非常用户友好。个人建议:如果您只是暂存几个文件,请使用git add -i。这将启动交互式暂存工具,使事情特别容易。此外,我强烈推荐阅读该书,因为它非常明确地介绍了git在实际情况下的使用。
[1]http://www.git-scm.com/book

我同意 git reset [file] 是取消暂存文件最直接的方式。 - user2558887
22
撤销和取消跟踪是不同的事情。 - Jaime Sangcap
在这种情况下,使用 git reset 不会撤销对文件的更改。它将取消跟踪该文件,但保留更改。 - mdzeko

5
我假设您想知道如何删除build文件夹或bin文件夹中的所有文件,而不是单独选择每个文件。您可以使用以下命令:

git rm -r -f /build\*

确保您在build目录的父级目录中。
此命令将递归“删除”bin/或build/文件夹中的所有文件。所谓的“删除”,是指git会假装这些文件已被“删除”,并且这些文件将不再被跟踪。Git实际上将这些文件标记为删除模式。

请确保您准备好了.gitignore文件以进行即将到来的提交。
文档:git rm

4
一种替代 assume-unchanged 的方法是 skip-worktree。后者具有不同的含义,类似于“Git 不应跟踪此文件。开发人员可以自由修改并鼓励进行本地更改。”
在您不希望跟踪更改(通常是大型)构建文件的情况下,assume-unchanged 是一个不错的选择。
如果该文件应具有默认内容,开发人员可以自由地在本地修改该文件,但不应将其本地更改推回远程 repo,则 skip-worktree 更适合。
另一种优雅的选项是在 repo 中添加一个默认文件。假设文件名为BuildConfig.Default.cfg。预期开发人员将本地重命名为 BuildConfig.cfg 并对其进行任何本地更改。现在将 BuildConfig.cfg 添加到 .gitignore 中,以便文件不会被跟踪。
参见此问题,其中包含已接受答案中的一些良好的背景信息。

1

要删除所有未跟踪的文件,请尝试这个终端命令。

 git clean -fdx

4
它将从磁盘中删除文件,但不会从 Git 历史记录中删除。 - Leonardo
谢谢,你成功地删除了我们的许多文件。恭喜! - undefined

1

运行

git rm -r --cached file_to_git_ignore

然后进入你的 gitignore 文件 并添加 path_to_file_to_git_ignore

祝你好运


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接