1610

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

4

13 回答 13

2224

相关的 Git 文档中

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

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

请注意,如果您已经有未暂存的更改,则必须在编辑忽略模式后运行以下命令:

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

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


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

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

通过以下方式反转它:

git update-index --no-skip-worktree <file-list>
于 2009-11-18T01:38:18.813 回答
462

更新:考虑git update-index --skip-worktree [<file>...]改用,谢谢@danShumway!请参阅Borealid 对两种选项差异的解释


老答案:

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

于 2013-01-22T15:39:00.423 回答
192

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

于 2013-08-19T15:21:38.763 回答
131

你有几个选择:

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

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

于 2009-11-18T01:45:29.127 回答
86

我认为您正在寻找:

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
于 2015-07-11T06:38:49.057 回答
59

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

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

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

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

于 2016-10-14T12:58:22.427 回答
53

你可以安装一些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开头的条目。SS标签表示状态为“跳过工作树”的文件。有关显示的文件状态的完整列表git ls-files:请参阅有关-t选项的文档git ls-files

于 2016-08-22T18:27:16.043 回答
21

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

 echo YOURFILE_OR_DIRECTOY >> .git/info/exclude 
于 2020-09-28T15:19:27.763 回答
8

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

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

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

  • 每个克隆本地排除(请注意,由于使用相对路径,调用命令时您应该在存储库的根目录中),将 ##FILE-NAME## 更改为.git/info/exclude
  • 全局 .gitignore,首先在此处生成全局 .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 文件,我添加了 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-ignore example_file.txt
git-unignore example_file.txt

于 2020-06-17T02:58:02.167 回答
4

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

于 2019-10-23T06:26:30.490 回答
0

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

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

于 2020-12-20T16:57:48.217 回答
0

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

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

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

于 2022-01-17T10:27:00.513 回答
-3

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

于 2016-08-08T21:34:35.800 回答