ChatGPT解决这个技术问题 Extra ChatGPT

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

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


M
Minhas Kamal

the relevant Git documentation

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

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

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

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

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

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

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

通过以下方式反转它:

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

请注意,请确保在添加到排除文件后运行 git update-index --assume-unchanged [<file>...]。直到那时,这些更改才会被采纳。
我不需要运行 'git update-index ...' 以使更改使用 git 1.7.9.5 生效。
如果您已经对文件进行了更改并且现在希望它被忽略,则只需要使用 git update-index 。如果您在进行更改之前更改排除,则没有必要。
虽然这会阻止文件在 .gitignore 等提交期间显示为已更改,但与被忽略的文件不同,如果您执行 git reset --hard,文件仍将重置回 repo 版本。
根据 stackoverflow.com/questions/23097368/…stackoverflow.com/questions/13630849/…skip-worktree 可能比 assume-unchanged 更受欢迎。
1
1615903

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

老答案:

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


请注意,我向 $GIT_DIR/info/exclude 添加了一个文件(例如,my-file.php),然后必须运行 git update-index --assume-unchanged my-file.php 才能开始忽略它。谢谢你的提示!
要撤消它:git update-index --no-assume-unchanged my-file.php
只是为了澄清:假设未更改用于跟踪文件(存在于回购中)...... OP 要求提供未跟踪文件,在这种情况下 .git/info/exclude 是您想要的(以避免污染经常共享和跟踪的 .gitignore)
根据 stackoverflow.com/questions/23097368/…,这被认为是不安全的,如果您不小心,您的文件可能仍会被提交。它旨在作为性能辅助,而不是作为解决此问题的万无一失的解决方案。
在阅读您的更新之前,我赶到了--assume-unchanged。我用 --no-assume-unchanged 撤消了,然后--skip-worktree...
p
phatmann

将以下行添加到 .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 ls-files -v | grep "^[[:lower:]]" - 你知道如何在 Windows cmd 上执行此操作吗?
安装一个真正的 shell(例如 Babun 提供 bash 或 zsh);)我知道你的感受,但我最近从 Windows 切换到 Linux,我再也不会使用 cmd 了。
@Haohmaru,您始终可以使用 WSL(适用于 Linux 的 Windows 子系统)。
哇 !伟大的命令
E
Emil Sit

你有几个选择:

在您的工作目录中留下一个脏(或未提交)的 .gitignore 文件(或使用 topgit 或其他类似的补丁工具自动应用它)。

将排除项放在您的 $GIT_DIR/info/exclude 文件中,如果这是特定于一棵树的话。

运行 git config --global core.excludesfile ~/.gitignore 并将模式添加到您的 ~/.gitignore。如果您想忽略所有树中的某些模式,则此选项适用。例如,我将它用于 .pyc 和 .pyo 文件。

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


我认为您需要 git config --global 全局设置选项。
实际上,只需将 .gitignore 添加到 .gitignore ;)!
P
Piotr Korlaga

我认为您正在寻找:

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

--skip-worktree--assume-unchangedthis SO question 进行了相关讨论
我将如何撤消此操作,或者查看当前通过 --skipworktree 忽略的文件/模式列表,我是否应该稍后改变主意并想再次开始跟踪文件?
如何撤消这个?
要撤消,请使用 git update-index --no-skip-worktree <file>
@Anomaly 要列出 --skip-worktree 忽略的文件,您需要这个 git ls-files -v | grep ^S
B
Brad Koch

您可以简单地将 .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 使用该文件,然后删除了我想在本地取消跟踪的文件。但是,在我推送更改后,远程存储库也删除了这些文件。我做错什么了吗?
哇,@xyz; .gitignore 是关于忽略本地目录中存在的文件。您应该做的是 git rm --cached 将它们从存储库中删除,但将它们留在您的本地。您应该能够使用 git reset --soft HEAD^ 之类的内容返回之前的提交以撤消该提交并恢复您的文件。这就是 git 的美妙之处:它仍然存在于你的 git 历史中。
B
Birchlabs

您可以安装一些 git aliases 以简化此过程。这将编辑您的 .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 会假装它在 config.xml 上没有看到任何更改——防止您意外提交这些更改。

git unignore config.xml git 将继续确认您对 config.xml 的更改——允许您再次提交这些更改。

git 将继续确认您对 config.xml 的更改——允许您再次提交这些更改。

git ignore git 会以上述方式列出您“忽略”的所有文件。

git 将以上述方式列出您“忽略”的所有文件。

我通过参考 phatmann's answer 构建了这些 - 它提供了相同的 --assume-unchanged 版本。

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

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


这不适用于未跟踪的文件:<(osx 上的 git 2.13.5)
是个 '!'应该在 '!git ls-files -v | grep "^S"' 中?该命令在那里对我不起作用..并且在删除它后似乎可以正常工作。
git 别名中的感叹号告诉 git 运行 外部命令,而不是 git 子命令。我把它放进去是因为我需要一个shell管道,所以我需要从外部调用git。我刚刚尝试删除感叹号(根据您的建议),但这 not 对我有用。我得到Expansion of alias 'ignored' failed; 'git' is not a git command。这是有道理的;不带感叹号:git 将您的命令别名为 git git ls-files …
感谢您的解释。我对 git alias 不熟悉,只是在创建别名之前在 shell 中运行以进行测试。
这是一个绝妙的解决方案。由于 git 跟踪每个目录,因此当您运行上述别名 git ignore <filename> 时,它仅适用于该目录。当您最终想要对该文件进行更改并提交并推送到远程时,只需使用方便的 git unignore <filename> 来临时重新开始跟踪它!谢谢!
Z
Zach Lysobey

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

 echo YOUR_FILE_OR_DIRECTORY >> .git/info/exclude

非常适合特定的符号链接
如果 echo 不起作用,您也可以直接在 .git/info/exclude 下输入文件夹
是的,同样的@UmairHamid
A
Ahmed Kareem

--assume-unchanged 和 --skip-worktree 都不是正确的方式来忽略本地文件...请检查 this answerthe documentation 中的注释git 更新索引。出于任何原因频繁更改(和/或从克隆更改为另一个)并且不应提交其更改的文件,那么这些文件不应该首先被跟踪。

但是,有两种在本地忽略文件的正确方法(都适用于未跟踪的文件)。要么将文件名放在 .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 文件名.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


a
aak318

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


伟大的!仅供参考:这仅是因为 git 仅跟踪(并允许您提交)文件,而不是文件夹。
v
voltdev

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

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

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


如果你不解释它是如何最简单的,你的解决方案会更简单。
d
drkvogel

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

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


G
Gavin S. Yancey

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


如果团队随后想要添加以添加 gitignore 怎么办?这甚至行得通吗?听起来像一个可怕的想法,甚至不应该工作的东西。
这个人的回答让我崩溃了。不可能有人这样做。
这是一个快速而简单的解决方案,只要有一个地方可以放置它。我们的存储库顶部有一个共享的 .gitignore 文件。但是我的脏文件位于一个很深的文件夹中,所以我只是在它们旁边添加了自己的 .gitignore。 +1