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

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

586028 次浏览

相关的Git留档

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

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

请注意,如果您已经有未分阶段的更改,则必须在编辑忽略模式后运行以下内容:

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

注意#0:这是git手册中使用到处都是的符号,只是为了指示git存储库的路径。如果设置了环境变量,那么它将覆盖你所在的任何存储库的位置,这可能不是你想要的。


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

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

反过来说:

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

你有几个选择:

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

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

更新:考虑使用git update-index --skip-worktree [<file>...]代替,谢谢@danShumway!见Borealid对两种选择差异的解释


老答案:

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

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

ignore = update-index --assume-unchangedunignore = update-index --no-assume-unchangedignored = !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

我想你正在寻找:

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

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

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

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标记表示状态为“跳过工作树”的文件。有关git ls-files显示的文件状态的完整列表:请参阅#4上的-t选项的留档。

您可以简单地将. gitignore文件添加到您的主目录,即$HOME/.gitignore~/.gitignore。然后告诉git使用该文件:

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

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

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

为了忽略未跟踪的文件,特别是如果它们位于(少数)未跟踪的文件夹中,一个简单的解决方案是向每个未跟踪的文件夹添加一个.gitignore文件,并在包含*的单行中输入,然后在新行中输入。如果未跟踪的文件位于几个文件夹中,这是一个非常简单明了的解决方案。对我来说,所有文件都来自单个未跟踪的文件夹vendor,上面的只是工作。

在本地忽略文件的正确方法…请检查git update-index的这个答案留档中的注释。出于任何原因经常更改(和/或从克隆更改为另一个克隆)并且不应提交其更改的文件,然后首先跟踪这些文件不应该

但是,有两种正确的方法可以在本地忽略文件(都适用于未跟踪的文件)。要么将文件名放在. git/info/排除文件中,这是. gitignore的本地替代方案,但特定于当前克隆。或者使用全局. gitignore(应该仅用于常见的辅助文件,例如pyz、pyache等),并且该文件将在您机器中的任何git存储库中被忽略。

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

  • 每个克隆本地排除(请注意,您应该在因为使用相对路径)调用命令时,将##FILE-NAME##更改为.git/info/exclude
  • Global. gitignore,首先使global. gitignore这里,然后将##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(你需要. bak来进行sed的就地修改(即你被迫添加一个文件扩展名到就地sed.即在替换之前进行备份),因此要删除. bak文件,我添加了rmfilename.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##.bakunset GITFILETOUNIGNORE}

然后你可以做:

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

这是排除本地文件的简短单行解决方案。

 echo YOUR_FILE_OR_DIRECTORY >> .git/info/exclude

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

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

只需简单地将路径添加到ypu要从当前repo的任何分支的提交中删除的文件:

  1. 在Windows目录设置中取消隐藏隐藏文件
  2. 打开路径REPO_MAIN_PATH/. git/info/排除
  3. 例如添加**/toExcludeFile.bat

就是这样!对我来说,上面的答案太长了。吻-保持愚蠢简单

太长别读-过滤输出以忽略文件


不要这样做。关于如何做到这一点的技术方法,有很好的答案。然而,我多次找到这个Q/A页面。正如你所看到的,有多种解决方案。问题是每个都会让git忽略该文件;这可能是你现在想要的,但也许不是未来。

细节中的魔鬼,

  • git将不再报告文件。
  • 你需要记住你使用了哪些机制。

要么将其添加到. gitignore,要么将过滤器写入git status,以主动过滤掉文本。每个都会忽略该文件,但为什么它被忽略的答案更明显。包装脚本(或命令行调用)的第二种情况非常明显地表明您选择忽略什么,以及您的工作流程是非标准的。