Git忽略已跟踪文件的部分本地更改

74

具体来说,我维护了一个包含我的 dotfiles 的 git 存储库。最近我开始在一台新机器上工作,并将存储库克隆到了该机器上。

现在,我希望对这个系统特定的 dotfiles 进行一些更改,但我希望忽略这些更改在存储库中的记录。

其他更改应该继续被跟踪和提交。

例如,在我的 .gitconfig 中,我有一个设置:

[push]
   default = simple

现在,我的新机器上使用的git版本非常旧,仍然不支持对推送进行设置simple。 因此,我想更改它,但仅在本地更改。

但是,如果我对我的.gitconfig文件进行任何其他更改,我希望跟踪这些更改。 有什么方法可以实现吗?

编辑:
我知道git update-index --assume-unchanged命令,但它的问题是git将不再跟踪我的文件,直到我撤销它。 然后,它会跟踪所有更改。
我希望忽略某些更改并跟踪其余部分。


可能是 提交机器特定的配置文件 的重复问题。 - Senseful
4个回答

189

尝试使用此命令:

git update-index --assume-unchanged FILENAME_TO_IGNORE

若要撤销操作并提交更改,使用以下命令:

git update-index --no-assume-unchanged

更新:

以下是如何列出当前目录下的“假定未更改”文件:

git ls-files -v | grep -E "^[a-z]"

由于-v选项将对“假定未更改”文件使用小写字母。


1
git update-index --assume-unchanged 的问题在于它不再跟踪我的文件,直到我撤销它。然后,它将跟踪所有更改。我希望忽略某些更改并跟踪其余部分。 - darnir
4
但这正是我在我的情况下所需要的!我的队友们使用的一个文件会导致测试套件变慢数十秒,因此我经常将其删除...但它被删除后污染了我的 git 会话。不过现在不再是这样了! - Dan Passaro
7
对于那些认为"--assume-unchanged完美,因为我想忽略文件的所有更改"的人,请尝试使用"--skip-worktree"。 - Drew
4
--skip-worktree解释:https://dev59.com/nWYr5IYBdhLWcg3wfaSc本文讨论Git中两个命令的区别:assume unchangedskip-worktree。这两个命令都可用于忽略Git跟踪文件更改,但它们使用的方法不同。assume unchanged将文件标记为“已缓存索引”,而skip-worktree标记文件以在未来的提交中跳过检查。建议使用assume unchanged来暂时忽略对文件的更改,并使用skip-worktree永久地忽略对文件的更改。 - CAD bloke
2
我对此的问题在于,如果对该文件的更改导致冲突,则“git checkout”仍然不允许我更改分支 :T - Jorge Orpinel Pérez
@JorgeOrpinel 在切换分支之前,您可以尝试使用 "git stash"。 - atupal

10

我不认为有特定的命令可以“取消跟踪”某个文件的某些更改。但是,您完全可以创建一个本地分支,从远程拉取更改,但永远不会将任何更改发送回去。


2
太好了!这正是我需要的!将这些更改发送到分支!谢谢!我一直在过度工程化这种情况。 - darnir
4
如果您有一个只拉取更新而从未将更改发送回去的本地分支,那么如何将在该本地分支中所做的更改传输到主代码库? - blipbloop

5
这里提供一种针对你的具体问题的备选解决方案。将 machine-config 配置放在一个名为 ~/.gitconfig.local 的文件中,然后将以下内容放入你的可版本控制的 ~/.gitconfig 文件中:
[include]
    path = ~/.gitconfig.local

这将告诉Git将在~/.gitconfig.local中发现的任何内容视为在~/.gitconfig中。是的,您可以覆盖设置。不需要该文件存在(如果没有~/.gitconfig.local文件,则Git将默默地忽略该设置)。
有关[include]的更多信息,请参见这里。 我在我的Emacs、Zsh、Git、Tmux等配置文件中遵循此策略,以便它们可以自定义而无需修改受版本控制的文件。为了实现这一点,我有init.local.el.zshrc.local.gitconfig.local.tmux.local.conf等文件。

0

正如Peter所建议的,您可以将那些机器特定的更改保留在一个分支中。显然,您必须小心地严格区分对那些机器特定文件的更改与“主线”的更改。有两种方法可以做到这一点:

  1. 每当更改主线时,保持变基分支(这是我的首选)
  2. 将主线更改合并到分支中(但显然永远不要反向合并)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接