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

dar*_*nir 66 git

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

现在,我希望对我的dotfiles进行一些更改,这些更改仅适用于此系统.我希望在我的存储库中忽略这些更改.

我应该继续跟踪和提交其他更改.

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

[push]
   default = simple
Run Code Online (Sandbox Code Playgroud)

现在,在我的新机器上,git的版本使用得很旧.它仍然不支持simplepush 的设置.所以,我想改变这一点,但仅限于本地.

但是,如果我对.gitconfig进行任何其他更改,我想跟踪这些.无论如何我能做到这一点?

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

atu*_*pal 167

尝试使用此命令:

git update-index --assume-unchanged FILENAME_TO_IGNORE
Run Code Online (Sandbox Code Playgroud)

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

git update-index --no-assume-unchanged
Run Code Online (Sandbox Code Playgroud)

更新:

以下是在当前目录下列出"假设未更改"文件的方法:

git ls-files -v | grep -E "^[a-z]"
Run Code Online (Sandbox Code Playgroud)

由于该-v选项将使用小写字母表示"假定未更改"文件.

  • 对于到达这里的人并认为"--assume-unchanged"是完美的,因为我想忽略对文件的所有更改"try"--skip-worktree"而不是. (7认同)
  • `--skip-worktree`解释:http://stackoverflow.com/questions/13630849/git-difference-between-assume-unchanged-and-skip-worktree (4认同)
  • 然而,这正是我在我的情况下所需要的!我的队友使用的文件会使测试套件减慢几十秒,因此我会一直删除它...但事实上它已经消失了我的git会话.不过了! (2认同)
  • 我遇到的问题是,如果对该文件的更改导致冲突,`git checkout` 仍然不会让我更改分支:T (2认同)

Pet*_*ton 8

我不相信有一个特定的命令会"跟踪"文件的某些更改.但是,没有理由不能创建一个本地分支,您可以从其中提取更改,但永远不会发回任何更改.

  • 请解释.如果您有一个只提取更改的本地分支,但从不发送任何更改,那么如何将您在该本地分支中所做的更改传输到主代码库? (4认同)
  • 咄!这正是我需要的!将这些更改发送到分支!谢谢!我一直在过度设计这种情况. (2认同)

Rad*_*ugh 5

这是针对您的具体问题的替代解决方案。将 machine-config 配置放入~/.gitconfig.local文件中,然后将以下内容放入版本控制中~/.gitconfig

[include]
    path = ~/.gitconfig.local
Run Code Online (Sandbox Code Playgroud)

这将告诉 Git 将它在 中找到的任何内容视为~/.gitconfig.local~/.gitconfig. 是的,您可以覆盖设置。不,它不需要文件存在(如果不存在,Git 将默默地忽略该设置~/.gitconfig.local)。

有关 的更多信息,请参阅此处[include]

我在 Emacs、Zsh、Git、Tmux 等的配置中遵循这个策略,这样它们就可以自定义,而不需要修改版本控制文件。为了实现这个目标,我有init.local.el、、、、等等。.zshrc.local.gitconfig.local.tmux.local.conf