如何阻止.gitignore出现在未跟踪的文件列表中?


971

我只是git init在我的新项目的根上做了一个。

然后我创建了一个.gitignore文件。

现在,当我键入时git status.gitignore文件将出现在未跟踪文件的列表中。这是为什么?


13
git add self && git commit -m "-1 for reverting existential depression" && git remote rm HEAD
Alastair

1
我可以忽略.git /文件夹并将其放在“ .gitignore”中吗?
Timo 2015年

2
您可以在Linux下的主文件夹中创建一个全局“ gitignore”并将其存储在其中:git config --global core.excludesfile〜/ .gitignore_global
Timo

14
我是通过搜索来到这里的how to gitignore .gitinore file,问题和接受的答案与标题并没有真正的关系。标题可能会有所改善。
m.rufca 2015年

6
有一些用例可以忽略.gitignore。我团队的工作流程要求我为本地开发环境更改一组文件,但不应提交这些文件。可以使用更好的体系结构来改进工作流程,但是这是我无法控制的。同时,让git注意那些文件是一种责任。因此,我只想在本地使用gitignore,也不想冒险提交.gitignore,因为它不应该与团队共享。
2015年

Answers:


959

.gitignore文件应位于您的存储库中,因此,如git status建议的那样,确实应将其添加并提交。它必须是存储库树的一部分,以便可以合并对其所做的更改,依此类推。

因此,将其添加到您的存储库中,不应忽略它。

如果您确实想要,可以将其添加.gitignore.gitignore文件中,如果您不想将其提交。但是,在这种情况下,最好将ignore添加到.git/info/exclude一个特殊的checkout-local文件,该文件的工作方式类似于.gitignore,但由于位于.git文件夹中而不会显示为“ git status” 。

另请参阅https://help.github.com/articles/ignoring-files


17
这不应该是存储库元数据的一部分,而不是要跟踪的文件吗?
endlith 2010年

13
存储库元数据对于存储库而言是本地的。例如,如果您在仓库中添加了一个提交挂钩,而有人克隆了您的仓库,那么他们将不会获得提交挂钩。
8月Lilleaas 2010年

91
@wukong,如果您在团队中工作,不是每个人都应该忽略同一组文件吗?这就是将.gitignore文件添加到资源库的原因。没有人说您必须将其部署为项目的一部分。
Ryan Lundy

13
@endolith和wukong不必在您的存储库中添加文件。您可以在许多不同的地方进行忽略设置。GitHub上有一篇很棒的文章help.github.com/ignore-files您可以在任何地方进行全局忽略设置,并且可以在仓库的.git元数据中拥有仓库的特定设置。
Boushley,2011年

6
@ deed02392在使用这些忽略文件时,您当然需要对放入文件中的内容进行判断,但它们仍有很多用处。例如,我使用Vim,因此在全局gitignore中,我将* .swp文件标记为已忽略。这样,我不必将其添加到我的每个项目中,而且从未使用过vim的人也不必担心它。
Boushley,2013年

282

如果要在Git树之外存储忽略文件列表,则可以使用.git / info / exclude文件。它仅适用于您回购的结帐。


19
+1,这非常适合与项目无关的忽略,例如emacs *〜备份文件,来自OS X的.DS_Store等。
2010年

38
@AugustLilleaas我个人更喜欢将这些类型的特定于{editor,platform}的文件放入其中,~/.gitignore因此我使用的任何存储库都将忽略它们。
Michael Mior

22
跟踪文件后,您可以git update-index --assume-unchanged <file>停止跟踪更改而无需更改您的存储库。这在需要进行本地更改的大型共享项目中非常有用,但是没有其他人希望看到您提交回购协议的东西。参见blog.pagebakers.nl
克里斯·埃斯普林

6
@AugustLilleaas:对于该用例,每用户gitignore更好。
机械蜗牛

3
感谢这篇文章中,我使用混帐SVN所以在服务器上SVN回购的其他用户不会真正想要的.gitignore检查英寸
enorl76

74

您实际上可以.gitignore.gitignore文件中添加一行。这将导致该.gitignore文件被git忽略。我实际上并不认为这是一个好主意。我认为忽略文件应受版本控制和跟踪。我只是出于完整性考虑。


7
为我工作!版本1.5.6.5。我也同意1800 INFORMATION,这不是一个好主意,但我认为在某些情况下可以(例如,您使用git-svn存储库,并且您不希望git-ish文件进入svn)。排除文件可能更好。
J. Polfer

4
@ehsanul-不得跟踪文件(您不应添加或提交文件)。您可以取消跟踪。在仅使用git的环境中,这可能不是一个好主意,但是,如果发生这种情况,例如将git用作Subversion存储库的智能客户端(没有其他人知道,<maniacalaugher>)-这样的技巧是很棒的。
Tomasz Gandor 2014年

2
@IshanSrivastava您可能已经跟踪了文件。尝试跑步git rm --cached .gitignore
Gideon

51

您还可以拥有一个全局用户git .gitignore文件,该文件将自动应用于您的所有存储库。这是IDE和编辑文件(例如有用swp*~文件VIM)。更改目录位置以适合您的操作系统。

  1. 添加到您的~/.gitconfig文件:

    [core]
    excludesfile = /home/username/.gitignore
    
  2. 创建一个~/.gitignore具有要忽略的文件模式的文件。

  3. 将点文件保存在另一个存储库中,以便进行备份(可选)。

每当您复制,初始化或克隆存储库时,也会使用全局gitignore文件。


6
我相信这是您的编辑者留下临时文件(例如。*。swp(VIM)和._ *(TM))临时文件的最佳解决方案,因为将这些规则连续添加到每个git repo都是没有道理的,并强制具有不同IDE的其他用户检查这些文件。
Thomas Hunter II

1
对于不应该推送到任何分支的忽略,这非常有用。当然,用您的实际用户名替换“用户名”,并且如果已经有第二个[core]部分,请不要将其添加到.gitconfig中-只需将excludesfile行放在现有的[core]部分下即可。
2015年

47

如果某人已经将a添加.gitignore到您的存储库中,但是您想对其进行一些更改并忽略这些更改,请执行以下操作:

git update-index --assume-unchanged .gitignore

来源


5
好主意,有一个原因.git/info/excludes存在。
Arrowmaster

6
我想也是有原因的--assume-unchanged。为什么一个比另一个更好?
Leif Gruenwoldt 2011年

9
.git/info/excludes如果文件已被跟踪,btw将不起作用。
Leif Gruenwoldt 2011年

这确实对我有所帮助,因为它已经提交了.gitignore,但我不想提交更改。我正在从Ubuntu 11.04 repos运行git 1.7.4.1,帮助页面将其添加到update-index中。“此选项还可以用作粗略的文件级机制,以忽略跟踪文件中未提交的更改(类似于.gitignore对未跟踪文件所做的操作。)如果需要在索引中修改此文件,Git将失败(正常)例如,在合并提交时;因此,如果假定未跟踪的文件在上游被更改,则您将需要手动处理这种情况。”
YonahW 2011年

我对这个答案投赞成票,因为一般来说,您需要针对主存储库初始状态执行此操作,并保留git功能的好处。没有充分的理由忽略此文件(期限)
Lazaros Kosmidis

37

添加.gitignore文件并提交后,它将不再显示在“未跟踪的文件”列表中。

git add .gitignore
git commit -m "add .gitignore file"
git status

20

以防万一别人有和我们一样的痛苦。我们想排除一个已经提交的文件。

这篇文章更有用: 使用.git / info / exclude太晚了

具体来说,您实际上需要使用命令git remove来忽略文件,请参见git rmhttp://www.kernel.org/pub/software/scm/git/docs/git-rm.html

你通过去测试

git rm --dry-run *.log
(如果您说要排除所有日志文件)

这将输出什么,如果你运行它排除在外。

然后

你通过去运行它

git rm *.log
(或您想要的任何文件名路径/表达式)

然后*.log.gitignore文件中添加一行。


4
当然,您可能希望在.gitignore中添加相关的模式(例如* .log),以便以后出现时它们不会使您混乱git status
Patrick O'Leary

2
尽管我的问题与OP的问题无关:感谢让我知道,对.gitignore进行更改后,如果需要更改文件,我将需要使用RM来“清理”我的仓库(如果文件已经被提交。)Noob错误,我知道,但这是我个人第一次看到有人提到的地方。
麦克

感谢您的反馈。是的,这就是为什么我写这本书的原因,来到这里然后走很长一段路来解决这个问题,我认为写出来会很好。:)
演变

16

当然,.gitignore文件会显示在状态中,因为它没有被跟踪,而git则将其视为可食用的新文件!

由于.gitignore是未跟踪的文件,因此当您将其放入.gitignore时,它是git会忽略的候选文件!

因此,答案很简单:只需添加以下行:

.gitignore # Ignore the hand that feeds!

到您的.gitignore文件!

而且,与August的回答相反,我应该说这不是.gitignore文件应该位于您的存储库中。碰巧,它可以是,这往往是方便。也许这是事实,因为.gitignore被创建为.git / info / exclude的替代方案的原因,后者没有被存储库跟踪的选项。无论如何,如何使用.gitignore文件完全取决于您。

作为参考,请查看kernel.org上的gitignore(5)联机帮助页


15

想法是将特定于您的项目的.gitignore文件放入文件中,并将其添加到存储库中(如上所述)。例如.pyc.o文件,记录的测试包造成的,一些灯具等。

对于您自己的设置创建的文件,但不一定会为每个用户显示(例如,.swp如果您使用vim则为文件,隐藏的ecplise目录等),则应使用.git/info/exclude(如上所述)。


14

首先,正如其他许多人已经说过的那样,您.gitignore应该由Git跟踪(因此不应被忽略)。让我解释一下原因。

(TL; DR:提交.gitignore文件,并使用全局.gitignore忽略由您的IDE或操作系统创建的文件)

您可能已经知道,Git是一个分布式版本控制系统。这意味着它允许您在不同的版本之间来回切换(即使开发已经分散到不同的分支中),并且还允许多个开发人员在同一个项目上工作。

尽管.gitignore在快照之间切换时跟踪自己也有好处,但提交快照的最重要原因是,您希望与从事同一项目的其他开发人员共享文件。通过将文件提交到Git中,其他贡献者.gitignore在克隆存储库时将自动获取文件,因此他们不必担心意外提交了不应提交的文件(例如日志文件,缓存目录,数据库凭据)等)。而且,如果在某个时候项目的.gitignore更新,他们可以简单地进行这些更改,而不必手动编辑文件。

当然,您将要忽略一些文件和文件夹,但是这些文件和文件夹是特定于您的,并且不适用于其他开发人员。但是,这些不应该在项目的中.gitignore。您可以在其他两个地方忽略文件和文件夹:

  • 由操作系统或IDE创建的文件和文件夹应放在全局文件中.gitignore。这样做的好处是,它将.gitignore应用于计算机上的所有存储库,因此您不必为每个存储库重复此操作。而且它没有与其他开发人员共享,因为他们可能正在使用其他操作系统和/或IDE。
  • 使用中的显式存储库排除,可以忽略不属于项目文件.gitignore或全局文件的文件。该文件将不会与其他开发人员共享,并且仅针对该单个存储库.gitignoreyour_project_directory/.git/info/exclude

值得一提的全球.gitignore
Gruber

我认为在初始设置后,应忽略.gitignore文件,因此不会发生意外更改。这并不意味着不能再对其进行更改,而是以某种方式防止了事故的发生。该文件上的事故可能会引起混乱,甚至危及某些工作,因此也应考虑“密封”(忽略自身)。
Sasa

@Sasa .gitignore仅用于忽略尚未被Git跟踪的文件。向其中添加已跟踪的文件.gitignore不会阻止您将更改提交到该文件。即使有可能,.gitignore当它指示Git忽略自身时,您将如何提交更改?
Nic Wortel

@Nic-在此线程底部的单独回复中,我已将详细说明传递给我了。
Sasa

12

注意以下“问题”有时您想添加目录,但这些目录中没有文件。一个简单的解决方案是创建一个.gitignore,其内容如下:

*

直到您意识到未添加目录(这已按预期到存储库中),此方法才能正常工作。原因是.gitignore也将被忽略,因此目录为空。因此,您应该执行以下操作:

*
!.gitignore

9

这似乎仅适用于当前目录,Git以忽略存储库中的所有文件。

更新这个文件

.git/info/exclude 

用通配符或文件名

*pyc
*swp
*~

5

如果您已经签入.gitignore并想忽略对其的修改,请查看以下答案

尝试使用以下命令:

git update-index --assume-unchanged FILENAME_TO_IGNORE

要撤消它(如果您想对其进行更改),请使用:

git update-index --no-assume-unchanged

更新

这是在当前目录下列出“假定未更改”文件的方法:

git ls-files -v | grep -E "^[a-z]"

作为-v选项,将对“假定未更改”的文件使用小写字母。


4

就我而言,我要排除现有文件。仅修改.gitignore不起作用。我遵循以下步骤:

git rm --cached dirToFile/file.php
vim .gitignore
git commit -a

这样,我从缓存中清除了要排除的文件,并将其添加到.gitignore中


对我来说最好的解决方案。您还可以使用git add。在第二个位置,在git commit -m“ fixing .gitignore”之后
brainray

3

导航到git repo的基本目录并执行以下命令:

echo '\\.*' >> .gitignore

如果您使用的是Mac,则所有的点文件都将被忽略,包括讨厌的.DS_Store。


4
我不会那样做。您可能需要点文件。相反,我只是直接添加.gitignore和.DS_Store。
爱德华·福尔克

2

最终用户很有可能只是想让Git忽略“ .gitignore”文件,因为Eclipse创建的IDE特定文件夹可能与NetBeans或另一个IDE不同。因此,要使源代码IDE处于敌对状态,就可以轻松地拥有一个不与整个团队共享的自定义git忽略,因为各个开发人员可能正在使用不同的IDE。


1

.gitignore关于忽略其他文件。git与文件有关,因此这与忽略文件有关。但是,随着git处理文件,此文件必须作为列出其他文件名的机制存在。

如果调用.the_list_of_ignored_files它,可能会更明显。

类推是您不想执行的待办事项列表。除非您将它们列出在某个地方,否则您将不会知道它们。


1

我认为在某些情况下,忽略.gitignore非常有用。例如,当您有多个团队或一个大型团队在同一代码库上工作时。在那种情况下,您需要具有某些约定,这些约定之一是关于git repo中忽略的约定。通常是忽略IDE或OS创建的文件和目录,某些生成的日志等。

但是,有一种势力倾向于对.gitignore文件进行非常规的更改。该.gitignore文件可以由不负责任的人进行进一步的改变,错误,通过使用,或在其他一些情况下的工具。

为了对此起反作用,我们可以按照以下步骤操作:

  1. 初始.gitignore应该反映团队中的惯例,
  2. 推送之后,应通过添加.gitignore条目来保护.gitignore并再次推送更改。.gitignore文件以这种方式被“ 密封 ”。

可以在本地更改“ 密封.gitignore文件,而无需将更改者传播给团队的其他成员。但是,如果整个团队都普遍同意进行更改,则可以“取消密封”,进行更改,然后再次“密封”。这不可能是错误的,只能是故意的。

可悲的是,您不能100%免受愚蠢的侵害,但是通过这种方式,您已尽一切可能防止愚蠢的事情发生。

如果您的团队规模较小,并且拥有非常优秀的专业人员,那么这并不重要,但是即使是那些家伙,也不必担心一件事。

.git/info/exclude当您无法对基础结构设置做任何事情,只是掩盖自己的**而不犯错误时,使用就很酷。

从对与错的立场出发,我投票赞成在.gitignore文件中添加.gitignore条目,从而使每个人都可以自由地在本地做他们想做的任何事,但不会侵犯他人。


0

我发现在.DS_Store文件中设置对讨厌文件的忽略的最佳位置.git/info/exclude

当您在其中设置git存储库时,IntelliJ似乎会自动执行此操作。


1
用户的全局忽略文件将是更好的忽略.DS_Store的地方
Max Nanasy 2013年
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.