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


从相关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>

您有几个选项:

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

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


更新:考虑使用git更新索引--跳过工作树[<file>…],谢谢@danShumway!参见Borealid对两个选项差异的解释。


旧答案:

如果您需要忽略跟踪文件的本地更改(我们对配置文件进行了本地修改),请使用git更新索引--假设未更改[<file>…]。


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


我认为您正在寻找:

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

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


您可以安装一些git别名以简化此过程。这将编辑.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忽略config.xmlgit将假装它没有看到config.xml上的任何更改,防止您意外提交这些更改。git unignore config.xmlgit将继续确认您对config.xml的更改,允许您再次提交这些更改。忽略gitgit将以上述方式列出您“忽略”的所有文件。


我参考了phatmann的答案构建了这些模型,它给出了一个假设不变的版本。

我介绍的版本使用跳过工作树来忽略本地更改。有关差异的完整解释,请参见Boreaid的答案,但本质上,跳过工作树的目的是让开发人员更改文件,而无需提交更改的风险。

这里提供的git-ignored命令使用git-ls-files-v,并过滤列表以仅显示以S标记开头的条目。S标记表示状态为“跳过工作树”的文件。有关gitls文件显示的文件状态的完整列表:请参阅gitls文件上-t选项的文档。


您可以简单地将.gitignore文件添加到您的主目录中,即$home/.gitignore/~/.giti忽略。然后告诉git将该文件与命令一起使用:

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

这是一个普通的.gitignore文件,git在决定忽略什么时会引用它。因为它在您的主目录中,所以它只适用于您,不会污染任何project.gitignore文件。

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


为了忽略未跟踪的文件,特别是如果它们位于未跟踪的(少数)文件夹中,一个简单的解决方案是向每个未跟踪的文件夹添加.gitignore文件,并在一行中输入包含*的内容,后跟一行。如果未跟踪的文件位于几个文件夹中,这是一个非常简单和直接的解决方案。对我来说,所有的文件都来自一个未经跟踪的文件夹供应商,上面的方法刚刚奏效。


假设不变和跳过工作树都不是忽略本地文件的正确方法。。。请检查此答案和git更新索引文档中的注释。由于任何原因不断频繁更改(和/或从一个克隆更改为另一个克隆)的文件,且不应提交其更改,则不应首先跟踪这些文件。

但是,有两种适当的方法可以在本地忽略文件(这两种方法都可以处理未跟踪的文件)。要么将文件名放在.git/info/exclude文件中,该文件是.gitignore的本地替代文件,但特定于当前克隆。或者使用global.gitignore(它应该只正确用于常见的辅助文件,例如pyz、pycache等),该文件将在机器中的任何git repo中被忽略。

为了实现上述自动化(添加到exclude或global.gitignore),可以使用以下命令(添加到bash配置文件):

每个克隆本地排除(请注意,您应该位于由于使用相对路径而调用命令时的存储库),将##FILE-NAME##更改为.git/info/excludeGlobal.gitignore,首先在这里设置Global.gitignor将##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文件rm filename.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忽略example_file.txtgit unignore示例文件.txt


这是一个简单的单行解决方案,用于排除本地文件。

 echo YOUR_FILE_OR_DIRECTORY >> .git/info/exclude

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

使用与.gitignore文件相同的格式编辑父repo/.git/modules/my子模块/info/exclude。


只需将路径添加到ypu希望从当前回购的任何分支上的提交中删除的文件:

取消隐藏Windows目录设置中的隐藏文件打开路径REPO_MAIN_Path/.git/info/exclude添加例如**/toExcludeFile.bat

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


TL;DR-过滤输出以忽略文件


不要这样做。关于这样做的技术方法,有很好的答案。然而,我已经多次找到这个问答页面。如您所见,有多种解决方案。问题是每一个都会使git忽略文件;这可能是你现在想要的,但未来可能不会。

细节中的魔鬼是,

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

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


在项目存储库中,接受的答案对我来说很有用。git在排除文件中添加了以下内容:

wp内容/插件

wp内容/上传