在已经跟踪大量文件的现有存储库上应用.gitignore


314

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

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

建议使用:git rm --cached并手动取消跟踪它们,但这将使我永远无法一一遍解它们。

我考虑过删除存储库并再次重新创建它,但是这次存在.gitignore文件,但是必须有更好的方法来执行此操作。


1
您可以选择使用git rm --cached整个目录-r(如果有帮助的话)
Nathan Wallace



Answers:


870

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

首先,提交所有未决的更改。

然后运行以下命令:

git rm -r --cached .

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

git add .

提交:

git commit -m ".gitignore is now working"

9
完美的答案!请同时添加一个git push origin以反映远程存储库中的更改。
Sanket Berde 2015年

8
我开始使用此答案...它几乎删除了我项目中的所有内容!显然我做错了。但是我要警告人们不要随便遵循这个建议。
Mark Olbert

4
当您删除并重新添加文件后,这是否最终会丢失文件的历史记录
Aran Mulholland

10
我想知道有多少个提交正在使用此.gitignore is now working消息。:)
ihavenoidea

1
这种方法对我来说效果很好。我创建了一个gitignore文件,忽略了整个目录,然后提交了创建gitignore的更改。然后,我按照上面所说的完全遵循了这三个命令。它运行完美,但是我应该说,如上所述,您必须首先“提交所有未决的更改”。
Erich Meissner

61
  1. 创建一个.gitignore文件,因此,您只需创建任何空白的.txt文件即可。

  2. 然后,您必须更改其名称,在cmd上写以下行(这git.txt是您刚创建的文件的名称):

    rename git.txt .gitignore

  3. 然后,您可以打开文件并写入所有要忽略的未跟踪文件。例如,我的看起来像这样:

```

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步不起作用,则应编写要添加的文件的孔路线。


4
@Karen_Wiznia,“ git config ... _global”为计算机上的所有Git存储库创建一个全局gitingore。OP不想这样做。
ivan7707 2015年

我希望我可以不止一次喜欢这个,我不断地回到这个问题寻求提醒。
安东尼·安德里亚

1
它应该是“ mv git.txt .gitignore”,而不是“重命名git.txt .gitignore”。
艾哈迈德F

30

如此处指定您可以更新索引:

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

这样,文件将不会显示在git status或中git diff

要再次开始跟踪文件,可以运行:

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

5
这是更好的答案-它仅集中于单个文件,即您不想由存储库跟踪的文件。标记最高的答案也可以,但是它不仅仅是忽略git跟踪文件而已。
克里斯·梅卡

1
这个不错。但是如果我们拉呢?是否存在合并冲突?
pramod

@pramod,很好的问题。我不太确定 在精简的测试存储库中尝试?
Patrick James McDougle,2016年

15

如果添加.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

这是一种“取消跟踪”在当前排除模式集下否则将被忽略的任何文件的方法:

(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-路径来恢复删除的索引条目)。然后进行新的提交,以排除“粗体”。

“粗体”仍将保留在任何旧提交中。如果您确实需要干净的历史记录,则可以使用git filter-branch生成旧提交的干净版本(使用git filter-branch的nb将“重写历史记录”,因此,如果您有任何合作者已经拉过,则不要轻易进行此操作。首次引入“粗体”后的任何历史承诺)。


听起来像是一个可靠的解决方案:)我想这是针对Linux Shell的吧?不幸的是我是Win7用户。我可以在Windows中这样做吗?
Tohid

0

从临时区域中删除文件

git reset HEAD .

添加所有更改

git add .

提交:

git commit -m ".gitignore is now working"

-1

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

先决条件

您需要浏览器才能访问您的github帐户。

脚步

  1. 在所需(现有)项目中创建一个新文件,并将其命名为.gitignore。你会得到启发提示的.gitignore模板,只要你命名文件的.gitignore。使用这些模板或使用gitignore.io生成gitignore文件的内容。
  2. 提交更改。
  3. 现在克隆该存储库。

玩得开心!


-3

git clean
在此运行中使用获得帮助

git clean -h

如果要先查看会发生什么,请确保通过-n开关进行空运行:

git clean -xn

删除gitingnored垃圾

git clean -xdf

注意:您可能会忽略本地配置文件,例如database.yml,该文件也会被删除。使用风险自负。

然后

git add .
git commit -m ".gitignore is now working"
git push
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.