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

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

现在,我希望对我的 dotfiles 进行一些修改,这些修改只针对这个系统。我希望在存储库中忽略这些更改。

我所做的其他更改应该继续被跟踪和提交。

例如,在我的. gitconfig 中,我将设置为:

[push]
default = simple

现在,在我的新机器上,使用的 git 版本非常旧。它仍然不支持推送设置 simple。所以,我想改变这一点,但仅限于本地。

但是,如果对。Gitconfig,我想跟踪这些。无论如何,我可以做到这一点?

编辑:
我知道 git update-index --assume-unchanged。它的问题是,git 将不再跟踪我的文件,直到我反向它。然后,它会跟踪所有的变化。
我希望忽略某些变化并跟踪其余的变化。

32475 次浏览

尝试使用以下命令:

git update-index --assume-unchanged FILENAME_TO_IGNORE

要逆转它(如果您想要对它进行更改) ,请使用:

git update-index --no-assume-unchanged

更新 :

下面是如何在工作目录下列出 “假设不变”文件:

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

因为 -v选项将使用小写字母表示“假设未改变”文件。

我不相信有一个特定的命令可以“解除跟踪”对文件的某些更改。但是,没有理由不能创建一个本地分支,您可以将更改从远程提取到该分支中,但是永远不能将任何更改发送回来。

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

  1. 无论何时更改 mainline,都要保持对分支重新定基(这是我的首选)
  2. 继续将主线更改合并到分支中(但显然 永远不会是向另一个方向合并的)

这里有一个解决你特定问题的替代方案。在 ~/.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等等。