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

时间:2009-11-18 01:36:48

标签: git ignore gitignore

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

12 个答案:

答案 0 :(得分:1545)

来自the relevant Git documentation

  

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

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

注意,如果您已经进行了非分段更改,则必须在编辑ignore-patterns后运行以下命令:

git update-index --assume-unchanged [<file>...]

关于$GIT_DIR 的注释:这是一个使用all over git手册的符号,仅用于指示git存储库的路径。如果设置了环境变量,那么它将覆盖你所在的任何回购的位置,这可能不是你想要的。

答案 1 :(得分:400)

更新:请考虑使用git update-index --skip-worktree [<file>...],谢谢@danShumway!请参阅Borealid's explanation on the difference of the two options


旧答案:

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

答案 2 :(得分:142)

将以下行添加到.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

答案 3 :(得分:101)

您有几种选择:

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

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

答案 4 :(得分:47)

我认为你在寻找:

git update-index --skip-worktree FILENAME

忽略所做的更改本地

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

答案 5 :(得分:42)

您可以安装一些git aliases来简化此过程。这会编辑[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将列出你所有的文件&#34;忽略&#34;以上述方式。

我通过引用phatmann's answer来构建这些内容 - 它提供了--assume-unchanged版本的相同内容。

我提供的版本使用--skip-worktree来忽略本地更改。有关差异的完整说明,请参阅Borealid's answer,但基本上--skip-worktree的目的是,以便开发人员更改文件而不会有提交更改的风险

此处显示的git ignored命令使用git ls-files -v,并过滤列表以仅显示以S标记开头的条目。 S标记表示状态为&#34;跳过工作树&#34;的文件。有关git ls-files显示的文件状态的完整列表:请参阅git ls-files-t选项的文档。

答案 6 :(得分:30)

您只需将.gitignore文件添加到您的主目录,即$HOME/.gitignore~/.gitignore。然后告诉git使用该命令:

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

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

多年来我一直在使用这种方法,效果很好。

答案 7 :(得分:6)

--assume-unchanged和--skip-worktree都是在本地忽略文件的正确方法 ...请选中this answer,然后git update-index的the documentation中的注释。出于任何原因经常更改(和/或从一个克隆更改到另一个)并且不应更改的文件,则这些文件不应该应首先跟踪。

但是,有两种正确的方法可以在本地忽略文件(这两种方法都适用于未跟踪的文件)。可以将文件名放在.git / info / exclude文件中,这是.gitignore的本地替代方案,但特定于当前克隆。或使用全局.gitignore(应仅对常见的辅助文件(例如pyz,pycache等)正确使用),并且该文件将在计算机中的任何git repo中都被忽略。

要将以上内容自动化(添加为排除或全局.gitignore),可以使用以下命令(添加到bash配置文件中):

  • 每个克隆本地排除项(请注意,您应位于 由于使用相对路径而在调用命令时存储库),将## FILE-NAME ##更改为.git/info/exclude
  • 全局.gitignore,首先创建全局.gitignore here,然后 将## FILE-NAME ##更改为~/.gitignore

Linux

alias git-ignore='echo $1 >> ##FILE-NAME##'
alias git-show-ignored='cat ##FILE-NAME##'
git-unignore(){
  GITFILETOUNIGNORE=${1//\//\\\/}
  sed -i "/$GITFILETOUNIGNORE/d" ##FILE-NAME##
  unset GITFILETOUNIGNORE
}

MacOS (您需要{.1ak.bak来进行sed就地修改(即,您被迫将文件扩展名添加到就地sed。即在替换某些内容之前进行备份),因此删除我添加了rm filename.bak的.bak文件)

alias git-ignore='echo $1 >> ##FILE-NAME##'
alias git-show-ignored='cat ##FILE-NAME##'
git-unignore(){
  GITFILETOUNIGNORE=${1//\//\\\/}
  sed -i.bak "/$GITFILETOUNIGNORE/d" ##FILE-NAME##
  rm ##FILE-NAME##.bak
  unset GITFILETOUNIGNORE
}

然后您可以做:

git-ignore example_file.txt
git-unignore example_file.txt

答案 8 :(得分:3)

这是一种简短的解决方案,在本地排除文件中添加一行。

 echo YOURFILE_OR_DIRECTOY >> .git/info/exclude 

答案 9 :(得分:1)

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

对于想要忽略子模块中本地文件的任何人:

使用与 my-parent-repo/.git/modules/my-submodule/info/exclude 文件相同的格式编辑 .gitignore