对已经跟踪大量文件的现有仓库应用.gitignore

541

我在代码库中有一个现有的Visual Studio项目。最近我在项目下添加了一个.gitignore文件,我认为这个文件告诉Git忽略在文件中列出的文件。

我的问题是,所有这些文件都已经被跟踪,据我所知,Git不会忽略在规则添加到文件中之前已经被跟踪的文件。

建议使用:git rm --cached并手动取消跟踪它们,但是逐个处理这些文件将耗费我很长时间。

我考虑过删除代码库并重新创建一个含有.gitignore文件的代码库,但一定有更好的方法来解决这个问题。


2
如果有需要,您可以使用“-r”选项从缓存中删除整个目录,命令为“git rm --cached”。 - Nathan Wallace
1
参见:从Git中取消跟踪文件 - Patrick James McDougle
3
可能与“忽略已提交到Git仓库的文件”[Ignore files that have already been committed to a Git repository]有重复,请参考此链接:https://dev59.com/L3M_5IYBdhLWcg3w-4nw。 - fkoessler
2
可能是重复的问题:如何让 Git “忘记” 一个曾经被追踪但现在在 .gitignore 中的文件 - Patrick James McDougle
7个回答

1414

这个答案解决了我的问题:

首先,提交所有待定的更改。

然后运行此命令:

git rm -r --cached .

这将从索引中删除所有内容,然后只需运行:

git add .

提交它:

git commit -m ".gitignore is now working"
请注意,当您将此推送到存储库并从其他地方拉取到仍在跟踪这些文件的状态时,文件将被删除。

28
完美答案!请同时添加 git push origin 命令以将更改更新到远程代码库中。 - Sanket Berde
17
我开始使用这个答案,结果几乎删除了我项目中的所有内容!显然我做错了什么。但我想提醒大家不要轻率地跟随这个建议。 - Mark Olbert
8
当您删除并重新添加文件时,这是否会导致文件的历史记录丢失? - Aran Mulholland
70
我在想,有多少次提交使用了这个“.gitignore现在可用”的信息。 :) - ihavenoidea
34
@ihavenoidea https://github.com/search?q=.gitignore+is+now+working&type=Commits 这就是你要的! - bharadhwaj
显示剩余10条评论

79
  1. 创建一个 .gitignore 文件,方法是新建一个空的 .txt 文件即可。

  2. 然后在命令提示符中输入以下命令(其中 git.txt 是你刚刚创建的文件名)来更改它的名称:

rename git.txt .gitignore

  1. 接下来,你可以打开这个文件,并写下所有你想要永久忽略的未被追踪的文件。例如,我的 .gitignore 文件如下所示:
    #OS junk files
    [Tt]humbs.db
    *.DS_Store
    
    #Visual Studio files
    *.[Oo]bj
    *.user
    *.aps
    *.pch
    *.vspscc
    *.vssscc
    *_i.c
    *_p.c
    *.ncb
    *.suo
    *.tlb
    *.tlh
    *.bak
    *.[Cc]ache
    *.ilk
    *.log
    *.lib
    *.sbr
    *.sdf
    *.pyc
    *.xml
    ipch/
    obj/
    [Bb]in
    [Dd]ebug*/
    [Rr]elease*/
    Ankh.NoLoad
    
    #Tooling
    _ReSharper*/
    *.resharper
    [Tt]est[Rr]esult*
    
    #Project files
    [Bb]uild/
    
    #Subversion files
    .svn
    
    # Office Temp Files
    ~$*

GitHub提供了一个有用的.gitignore文件集合

  1. 获得该文件后,您需要像添加其他文件一样将其添加到git存储库中,只不过它必须位于存储库的根目录中。

  2. 然后在终端中输入以下命令:

git config --global core.excludesfile ~/.gitignore_global

来自官方文档:

您还可以创建全局.gitignore文件,它是每个Git存储库中忽略文件规则的列表。例如,您可以在~/.gitignore_global处创建此文件并添加一些规则。

打开终端。在终端中运行以下命令:git config --global core.excludesfile ~/.gitignore_global

如果存储库已经存在,则必须运行这些命令:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"
如果步骤2不奏效,那么你应该写下你想添加的文件的完整路径。

9
"git config ... _global" 命令会为计算机上所有 Git 仓库创建一个全局的 .gitignore 文件。但是原帖作者不想这样做。 - ivan7707
1
我希望我可以多次点赞,我不断地回到这个问题上来寻找这个提醒。 - Antony D'Andrea
3
应该使用"mv git.txt .gitignore"而不是"rename git.txt .gitignore"。 - Ahmad F

48
如果你添加了 .gitignore 文件太晚,Git 会继续跟踪已经提交的文件。要解决这个问题,你可以删除所有不想要的文件的缓存实例。
首先,要检查你实际上正在跟踪哪些文件,可以运行以下命令: git ls-tree --name-only --full-tree -r HEAD 假设你在像 cache/ 这样的目录中找到了不想要的文件,那么最好只针对该目录而不是所有文件。
因此,不要使用以下命令: git rm -r --cached . 最好只针对不需要的文件或目录: git rm -r --cached cache/ 然后进行所有更改, git add . 并提交... git commit -m ".gitignore is now working" 参考:https://amyetheredge.com/code/13.html

2
这是最好的、最干净的答案,如果你只想删除一些文件,而不是整个代码库。我给你点赞。 - Apuig
谢谢!我刚刚升级了。按照描述工作正常。在执行 git commit 后,您可以看到受影响的文件,然后将它们从仓库中删除。完美! - Coffee and Code
仅供概念理解,假设我没有其他更改,在这种情况下步骤“git add .”是必要的还是安全的惯例? - qqqqq
如果没有其他的暂存更改,请继续提交。 - Eli Nunez

47

正如这里所指定的,您可以更新索引:

git update-index --assume-unchanged /path/to/file

这样做会使文件在 git statusgit diff 中不再显示。

要重新开始跟踪这些文件,您可以运行:

git update-index --no-assume-unchanged /path/to/file

8
这是更好的答案 - 它仅关注单个文件,即您不希望被存储库跟踪的文件。最高评分答案也可以起作用,但它做的不仅仅是忽略 Git 跟踪的文件。 - Krzysztof Chris Mejka
1
这是一个不错的方案。但如果我们进行合并,会有任何合并冲突吗? - pramod
@pramod,好问题。我不是很确定。你可以在一个简化的测试存储库中尝试一下吗? - Patrick James McDougle

2
这里有一种方法可以“取消跟踪”在当前排除模式下本应被忽略的任何文件。
(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

这将使文件保留在您的工作目录中,但从索引中删除。
这里使用的技巧是向git ls-files提供一个不存在的索引文件,以便它认为没有被跟踪的文件。上面的shell代码要求查找如果索引为空,则将被忽略的所有文件,然后使用git rm从实际索引中删除它们。
在文件被“取消跟踪”之后,使用git status验证是否没有重要内容被删除(如果有,则调整您的排除模式并使用git reset -- path来恢复已删除的索引条目)。然后创建一个新的提交,省略“crud”。
“crud”仍将存在于任何旧提交中。如果您确实需要一个干净的历史记录版本,可以使用git filter-branch生成干净的旧提交版本(注意:使用git filter-branch将“重写历史记录”,因此如果您有任何合作者在“crud”首次引入后拉取了您的任何历史提交,则不应轻易进行)。

听起来是个不错的解决方案 :) 我猜这是针对Linux shell的,我很遗憾我是Win7用户。有没有任何方法可以在Windows上做到这一点? - Tohid

-5

使用 git clean
运行时获取帮助

git clean -h

如果你想先看看会发生什么,请确保传递 -n 开关进行干运行:
git clean -xn

删除 gitignore 的垃圾文件

git clean -xdf

注意:您可能会忽略本地配置文件,例如database.yml,这些文件也将被删除。请自行承担风险。

然后

git add .
git commit -m ".gitignore is now working"
git push

-5

我认为这是向现有存储库添加 .gitignore 文件的简单方法。

先决条件:

您需要浏览器来访问您的 Github 帐户。

步骤

  1. 在所需(现有)项目中创建一个名为.gitignore的新文件。一旦将文件命名为.gitignore,您将获得有关 .gitignore 模板的提示。使用这些模板或使用 gitignore.io 生成您的 gitignore 文件内容。
  2. 提交更改。
  3. 现在克隆此存储库。

玩得开心!


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