如何配置git在本地忽略某些文件?


1349

我可以在本地忽略文件而不污染其他所有人的全局git配置吗?我有处于git状态的垃圾邮件的未跟踪文件,但是我不想为我在本地分支机构中拥有的每个单个随机未跟踪文件提交git config更改。

Answers:


1859

相关的Git文档中

特定于特定存储库但无需与其他相关存储库共享的模式(例如,位于存储库内但特定于一个用户工作流程的辅助文件)应放入该$GIT_DIR/info/exclude文件中。

.git/info/exclude文件具有与任何.gitignore文件相同的格式。另一个选项是将设置core.excludesFile为包含全局模式的文件的名称。

请注意,如果您已经撤消了更改,则必须在编辑忽略模式之后运行以下命令:

git update-index --assume-unchanged <file-list>

注意事项$GIT_DIR:这是一个符号使用遍布 git的手册只是为了表明路径git仓库。如果设置了环境变量,那么它将覆盖您所在的任何存储库的位置,而这可能不是您想要的。


编辑:另一种方法是使用:

git update-index --skip-worktree <file-list>

通过以下方式将其反转:

git update-index --no-skip-worktree <file-list>

204
注意,请确保运行 git update-index --assume-unchanged [<file>...]在添加到排除文件之后。直到那时,更改才会生效。
tollmanz 2013年

30
我不需要运行git update-index ...即可使更改使用git 1.7.9.5生效。
杰弗里·马丁内斯

39
如果已经对文件进行了更改并且现在希望忽略它,则只需要使用git update-index。如果在进行更改之前将更改排除在外,则没有必要。
布雷迪·艾默生

13
虽然这可以防止文件在提交时像.gitignore一样在更改过程中出现,但与被忽略的文件不同,如果您执行git reset --hard,则文件仍将重置为回购版本。
布雷迪·爱默生

19
对于每个stackoverflow.com/questions/23097368/…stackoverflow.com/questions/13630849/…,它们skip-worktree可能会更受欢迎assume-unchanged
danShumway

436

更新:考虑使用git update-index --skip-worktree [<file>...]代替,谢谢@danShumway!请参阅Borealid关于这两种选择的区别的说明


旧答案:

如果您需要忽略对跟踪文件的本地更改(我们对本地配置文件进行了修改),请使用git update-index --assume-unchanged [<file>...]


8
请注意,我在$ GIT_DIR / info / exclude中添加了一个文件(例如,my-file.php),然后必须运行git update-index --assume-unchanged my-file.php该文件才能开始被忽略。谢谢你的提示!
tollmanz 2013年

78
撤消操作: git update-index --no-assume-unchanged my-file.php
2013年

18
只是为了澄清:假设未更改是针对跟踪文件(存在于仓库中)... OP要求提供UNtracked文件,在这种情况下.git/info/exclude,您想要的是(以避免污染经常共享和跟踪的.gitignore)
dyodji

7
根据stackoverflow.com/questions/23097368/…,这被认为是不安全的,如果您不小心,可能仍会提交文件。其目的是作为性能帮助,而不是针对此问题的万无一失的解决方案。
danShumway 2015年

3
--assume-unchanged在阅读您的更新之前,我冲到了。我取消了--no-assume-unchanged然后执行--skip-worktree...我是否清楚?
Nicolas Miari '16

162

将以下行添加到.gitconfig文件的[alias]部分

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

现在,您可以git ignore my_file用来忽略对本地文件git unignore my_file的更改,并停止忽略更改。git ignored列出被忽略的文件。

该答案来自http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html


1
“!git ls-files -v | grep” ^ [[:: lower:]]“-您是否有机会在Windows cmd上执行此操作?
Haohmaru

3
安装真实的外壳程序(例如Babun提供bash或zsh);)我知道您的感受,但是最近我从Windows切换到Linux,并且我再也不会使用cmd了。
Xerus

@Haohmaru,您可以始终使用WSL(Linux的Windows子系统)。
Sz

110

您有几种选择:

  • .gitignore在工作目录中保留一个肮脏(或未提交)的文件(或使用topgit或其他一些此类补丁工具自动应用该文件)。
  • 将排除项放入 $GIT_DIR/info/exclude如果文件特定于一棵树,则将文件文件中。
  • 运行git config --global core.excludesfile ~/.gitignore并向其中添加模式~/.gitignore。如果要忽略所有树中的某些模式,则此选项适用。例如,我用于.pyc.pyo文件。

另外,请确保您使用的是模式,而不是显式枚举文件(如果适用)。


10
我认为您需要git config --global全局设置该选项。
乔什·李

7
实际上,只需将.gitignore添加到.gitignore;)!
Dominik George

68

我认为您正在寻找:

git update-index --skip-worktree FILENAME

忽略本地更改

这是http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/有关这些解决方案的更多说明!

撤消使用:

git update-index --no-skip-worktree FILENAME

9
之间有一个相关的讨论--skip-worktree,并--assume-unchanged这太问题
Merwer

1
我将如何撤消此操作,或者查看当前通过忽略的文件/模式列表--skipworktree,我以后应该改变主意并希望再次开始跟踪文件吗?
异常,

1
如何撤消呢?
user1735921

3
要撤消操作,请使用git update-index --no-skip-worktree <file>
user1735921

49

您可以安装一些git别名来简化此过程。这将编辑文件的[alias]节点.gitconfig

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

为您安装的快捷方式如下:

  • git ignore config.xml
    • git会假装它看不到任何更改config.xml-防止您意外提交这些更改。
  • git unignore config.xml
    • git将继续确认您所做的更改config.xml-允许您再次提交这些更改。
  • git ignored
    • git将以上述方式列出您“忽略”的所有文件。

我通过参考phatmann的答案来构建这些内容-提出了一个--assume-unchanged了相同版本。

我提供的版本--skip-worktree用于忽略本地更改。有关差异的完整说明,请参见Borealid的答案,但是本质上--skip-worktree,其目的是让开发人员更改文件而没有提交更改的风险

git ignored此处显示的命令使用git ls-files -v,并过滤列表以仅显示以S标记开头的条目。该S标记表示其状态为“跳过worktree”的文件。有关显示的文件状态的完整列表git ls-files:请参阅文档中有关该-t选项的信息git ls-files


1
这对于未跟踪的文件不起作用:<(在osx上为git 2.13.5)
Terra Ashley

是个 '!' 应该在'!git ls-files -v | grep "^S"'吗?该命令对我不起作用,并且在该命令上删除后似乎工作正常。
提里斯(Tiris),

git别名中的感叹号告诉git运行外部命令,而不是git子命令。我放进去是因为我需要一个外壳管道,所以我需要从外部调用git。我只是试图消除感叹号(根据你的建议),但这不是为我工作。我懂了Expansion of alias 'ignored' failed; 'git' is not a git command。这很有道理;不带感叹号:git将命令别名为git git ls-files …
Birchlabs

感谢您的解释。我不熟悉git别名,只是在外壳中运行以测试别名。
提里斯(Tiris)

这是一个绝妙的解决方案。由于git跟踪每个目录,因此当您运行上述别名时git ignore <filename>,它仅适用于该目录。当您最终要对该文件进行更改并提交并推送到远程时,只需使用方便的工具git unignore <filename>即可临时开始再次跟踪它!谢谢!
nickang '18

42

您只需将.gitignore文件添加到主目录(即$HOME/.gitignore或)即可~/.gitignore。然后告诉git使用以下命令使用该文件:

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

这是一个普通的.gitignore文件,git在决定忽略什么时会引用该文件。由于它位于您的主目录中,因此它仅适用于您,不会污染任何项目.gitignore文件。

多年来,我一直使用这种方法取得了不错的效果。


谢谢@EricChen。我已经更新了答案;尝试一下,然后使用git check-ignore <file-name>进行验证。LMK(如果它对您
有用)

它仅对我=git config --global core.excludesfile ~/.gitignore
有用,

我将.gitignore文件放在主目录下,并告诉git改用该文件,然后删除我要在本地取消跟踪的文件。但是,在我推送更改后,远程存储库也删除了这些文件。我做错什么了吗?
zyy

哇,@ xyz; .gitignore关于忽略本地目录中存在的文件。您应该做的是git rm --cached将其从存储库中删除,但将其留在本地。您应该可以使用git reset --soft HEAD^撤消提交并恢复文件的方式返回到先前的提交。这就是git的美:在您的git历史中仍然存在。
JESii

2

为了忽略未跟踪的文件(尤其是当它们位于未跟踪的(几个)文件夹中)时,一种简单的解决方案是将.gitignore文件添加到每个未跟踪的文件夹中,并在包含单行的后一行输入*新行。如果未跟踪的文件位于几个文件夹中,则这是一个非常简单直接的解决方案。对我来说,所有文件都来自一个未跟踪的文件夹vendor,以上文件都可以正常工作。


1
大!仅供参考:之所以起作用,是因为git仅跟踪(并允许您提交)文件,而不跟踪文件夹。
jmiserez

-2

如果您的存储库还没有.gitignore文件,那么一个简单的解决方案是创建一个.gitignore文件,并将其添加.gitignore到要忽略的文件列表中。


4
如果团队随后想要添加以添加gitignore,该怎么办?这还行吗?听起来像一个可怕的主意,甚至是行不通的。
比约恩

这个家伙的回答使我震惊。绝对没有人这样做。
马丁·钱伯林

只要有放置的地方,这是一种快速简单的解决方案。我们的仓库.gitignore顶部有一个共享文件。但是我的脏文件在一个深文件夹中,因此我在文件.gitignore旁边添加了自己的文件。+1
joeytwiddle
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.