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

Jac*_*ine 959 git version-control dvcs gitignore

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

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

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

Aug*_*aas 944

.gitignore文件应该在您的存储库中,因此应该按照git status建议将其添加并提交.它必须是存储库树的一部分,因此可以合并对它的更改等.

因此,将它添加到您的存储库,它不应该被gitignored.

如果您真的想要,可以添加.gitignore.gitignore文件中,如果您不希望它被提交.但是,在这种情况下,最好将忽略添加到.git/info/exclude一个特殊的checkout-local文件中,该文件就像.gitignore一样,但由于它位于.git文件夹中,因此不会显示在"git status"中.

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

  • @wukong,如果你在一个团队工作,不应该每个人都应该忽略同一组文件吗?这就是.gitignore文件被添加到存储库的原因.没有人说你必须将它作为项目的一部分进行部署. (91认同)
  • 这不应该是存储库元数据的一部分而不是被跟踪的文件吗? (17认同)
  • 存储库元数据是存储库的本地元数据.例如,如果您向repo添加提交挂钩,并且有人克隆您的repo,则它们将不会获得提交挂钩. (13认同)
  • @endolith和wukong它不一定是你的仓库中的文件.您可以在许多不同的地方进行忽略设置.GitHub上有一篇很棒的文章http://help.github.com/ignore-files/您可以在任何地方进行全局忽略设置,并且可以在repo的.git元数据中设置repo特定设置. (13认同)
  • @ deed02392在使用这些忽略文件时,你当然需要对你所放入的内容进行判断,但它们仍有一些很好的用途.例如,我在我的全局gitignore中使用Vim,因此我将*.swp文件标记为忽略.这样我就不必将它添加到我的每个项目中,并且不使用vim的人不必担心它. (5认同)
  • 我的团队和我发现最好将*project*相关的​​东西放在`.gitignore`文件中,将*dev/env/machine*相关文件放在`.git/info/exclude`文件中.这样我们就不会因为他/她选择了特定的开发设置而使gitignore列表中只包含可能与一个人相关的内容.具体示例:`.DS_Store`文件仅与我相关,因为我正在使用macOS (4认同)
  • 对于git-svn,我没有gitignore文件.我使用的是.git/info/excludes,它是一个不会出现在"git status"中的存储库本地文件,但它的工作原理就像gitignore一样. (3认同)
  • @Boushley这样做是不是危险的做法,如果半个团队最终忽略另一半实际正在进行的文件(并且项目依赖于)? (2认同)
  • 对于特定环境本地的文件,全局忽略文件非常好.例如,.DS_Store文件特定于OS X上的Finder.app,并不真正属于项目的.gitignore文件.eclipse和intellij文件也是如此,除非当然有一个规则,即每个在项目上工作的人都使用特定的IDE. (2认同)
  • 我在团队中工作,虽然我们确实想忽略同一组核心模式,但我被要求使用全局.gitignore,例如模式`*.swp`.这是由Vim创建的,只有我的一些团队(包括我)用于编写代码. (2认同)

Paw*_*dan 279

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

  • @AugustLilleaas我个人更喜欢将这些类型的{editor,platform}特定文件放在`〜/ .gitignore`中,因此对于我工作的任何存储库都会忽略它们. (37认同)
  • 跟踪文件后,您可以使用`git update-index --assume-unchanged <file>`来停止跟踪更改而不更改您的repo.这对于需要进行本地更改的大型共享项目非常有用,但是没有其他人希望看到您的内容被提交到repo.见[blog.pagebakers.nl](http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/) (21认同)
  • +1,这非常适合忽略与项目无关的内容,例如emacs*〜备份文件,OS X中的.DS_Store等. (19认同)
  • @AugustLilleaas:[Per-user gitignore](http://stackoverflow.com/questions/767147/how-do-i-tell-git-to-ignore-gitignore/974188#974188)对于该用例更好. (6认同)
  • 感谢这个提示,我正在使用git-svn,因此服务器上的svn repo的其他用户不会完全想要.gitignore签入. (3认同)

180*_*ION 74

你实际上可以在你的".gitignore"文件中添加一行".gitignore".这将导致git忽略".gitignore"文件.我实际上并不认为这是个好主意.我认为忽略文件应该受版本控制和跟踪.我只是为了完整而把它放在那里.

  • 为我工作!版本1.5.6.5.我也同意1800的信息,这不是一个好主意,但我认为在某些情况下它可能没问题(比如你使用git-svn存储库,并且你不希望git-ish文件转到svn).排除文件可能更好. (7认同)
  • @ehsanul - 不得跟踪该文件(您不应该添加或提交它).你可以解开它.这在git-only环境中可能不是一个好主意,但是如果你发生了例如使用git作为subversion存储库的智能客户端(没有其他人知道,<疯狂的笑声>) - 这样的技巧很棒. (4认同)
  • @IshanSrivastava您可能已经跟踪了文件。尝试运行`git rm --cached .gitignore` (2认同)

Ale*_*eek 51

您还可以拥有一个全局用户git .gitignore文件,该文件将自动应用于您的所有回购.这对IDE和编辑器文件很有用(例如swp,*~Vim的文件).更改目录位置以适应您的操作系统

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

    [core]
    excludesfile = /home/username/.gitignore
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个~/.gitignore包含要忽略的文件模式的文件

  3. 将您的点文件保存在另一个仓库中,以便备份(可选).

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

  • 我相信这是编辑器留下临时文件的最佳解决方案,例如.*.swp(VIM)和._*(TM),因为将这些规则连续添加到每个git仓库是没有意义的,并强制其他用户使用不同的IDE来检查这些文件. (6认同)
  • 这对于不应该推送到任何分支的忽略非常有效。当然,将“用户名”替换为您的实际用户名,并且如果您已经有一个 [core] 部分,则不要向 .gitconfig 添加第二个 [core] 部分 - 只需将 excludesfile 行放在现有的 [core] 部分下。 (2认同)

Lei*_*ldt 45

如果有人已经.gitignore在您的仓库中添加了一个,但您想对其进行一些更改并忽略这些更改,请执行以下操作:

git update-index --assume-unchanged .gitignore

来源.

  • 如果已经跟踪了文件,则.tit`.git/info/excludes`不起作用. (9认同)
  • 不好的想法,有一个原因`.git/info/excludes`存在. (5认同)
  • 我认为有一个原因`--assume-unchanged`也存在.为什么一个比另一个好? (5认同)

Gre*_*ill 37

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

git add .gitignore
git commit -m "add .gitignore file"
git status
Run Code Online (Sandbox Code Playgroud)


Evo*_*lve 20

只是让别人有同样的痛苦.我们想要排除已经提交的文件.

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

具体你需要忽略一个文件实际上是使用命令git remove参见git rm(http://www.kernel.org/pub/software/scm/git/docs/git-rm.html)

你去试试吧

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

这将输出运行时将被排除的内容.

然后

你去吧

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

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

  • 当然,你可能会想增加相关的模式(即*.LOG)添加到您的.gitignore来跟进,因此,如果他们在未来显示它们不会堆积在你的`git的status`. (4认同)
  • 虽然我的问题与OP的问题无关:感谢让我知道在更改.gitignore之后我需要使用RM"清理"我的仓库(如果文件已经被评了.)Noob错误我知道,但这是我个人见过的第一个提到的地方. (2认同)

bay*_*yer 15

我们的想法是将特定于项目的.gitignore文件放入文件中(如前所述)将其添加到存储库中.例如.pyc.o文件,测试套件创建的日志,一些固定装置等.

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


cha*_*ase 15

当然.gitignore文件显示在状态上,因为它没有跟踪,git认为它是一个美味的新文件!

既然.gitignore是一个未经跟踪的文件,那么当你将它放入.gitignore时它是被git忽略的候选者!

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

.gitignore # Ignore the hand that feeds!
Run Code Online (Sandbox Code Playgroud)

到您的.gitignore文件!

而且,与August的回复相反,我应该说,并不是.gitignore文件应该在你的存储库中.它恰好可以发生,这通常很方便.而且这可能是因为这就是为什么.gitignore被创建为.git/info/exclude的替代品,它没有被存储库跟踪的选项.无论如何,你如何使用.gitignore文件完全取决于你.

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


Nic*_*tel 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


Maz*_*aze 12

注意以下"问题"有时您想要添加目录但这些目录中没有文件.简单的解决方案是创建一个包含以下内容的.gitignore:

*
Run Code Online (Sandbox Code Playgroud)

这个接缝工作正常,直到你意识到没有添加目录(正如预期的那样存储库.原因是.gitignore也将被忽略,因此目录是空的.因此,你应该做这样的事情:

*
!.gitignore
Run Code Online (Sandbox Code Playgroud)


小智 8

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

更新此文件

.git/info/exclude 
Run Code Online (Sandbox Code Playgroud)

用你的外卡或文件名

*pyc
*swp
*~
Run Code Online (Sandbox Code Playgroud)


Aar*_*ron 6

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

尝试使用此命令:

git update-index --assume-unchanged FILENAME_TO_IGNORE
Run Code Online (Sandbox Code Playgroud)

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

git update-index --no-assume-unchanged
Run Code Online (Sandbox Code Playgroud)

更新

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

git ls-files -v | grep -E "^[a-z]"
Run Code Online (Sandbox Code Playgroud)

由于该-v选项将使用小写字母表示“假定未更改”文件。


And*_*hia 5

就我而言,我想排除现有文件。仅修改.gitignore不起作用。我按照以下步骤操作:

git rm --cached dirToFile/file.php
vim .gitignore
git commit -a
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我从缓存中清除了我想要排除的文件,并将其添加到.gitignore中。