Git ignore local changes to portions of tracked files

Git

Git Problem Overview


Specifically, I maintain a git repository of my dotfiles. I recently started working on a new machine and cloned my repository on the same.

Now, I wish to make some changes to my dotfiles which are specific to this system only. These changes I wish to ignore in my repository.

Other changes that I make, should continue to be tracked and committed.

For example, in my .gitconfig, I have a setting as:

[push]
   default = simple

Now, on my new machine, the version of git being used it very old. It still not not support the setting simple for push. So, I'd like to change this, but only locally.

However, if I make any other changes to my .gitconfig, I'd like to keep track of those. Anyway I can achieve this?

EDIT:
I know of git update-index --assume-unchanged. The problem with it is that git will no longer track my file at all, until I reverse it. And then, it will track all changes.
I wish to ignore certain changes and track the rest.

Git Solutions


Solution 1 - Git

Try using this command:

git update-index --assume-unchanged FILENAME_TO_IGNORE

To reverse it (if you ever want to commit changes to it), use:

git update-index --no-assume-unchanged

UPDATE:

Here's how to list 'assume unchanged' files under current directory:

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

As the -v option will use lowercase letters for 'assume unchanged' files.

Solution 2 - Git

I don't believe there's a specific command that will 'untrack' certain changes to a file. However, there's no reason that you couldn't create a local branch into which you pull changes from your remotes, but never send any changes back.

Solution 3 - Git

Here is an alternative solution to your specific problem. Place machine-config configuration in a ~/.gitconfig.local file, and then put the following in your version-controlled ~/.gitconfig:

[include]
	path = ~/.gitconfig.local

This will tell Git to treat anything it finds in ~/.gitconfig.local as if it were in ~/.gitconfig. Yes, you can override settings. No, it does not require the file to exist (Git will silently ignore the setting if there is no ~/.gitconfig.local).

See here for more information about [include].

I follow this strategy in my configurations for Emacs, Zsh, Git, Tmux, etc., so that they are customizable without the need to modify version-controlled files. To accomplish this, I have init.local.el, .zshrc.local, .gitconfig.local, .tmux.local.conf, and so on.

Solution 4 - Git

As suggested by Peter you can keep those machine specific changes in a branch. Obviously you will have to be careful to strictly separate changes to those machine specific files from the "mainline". There are 2 ways for doing this:

  1. Keep rebasing the branch whenever you change the mainline (this would be my preference)
  2. Keep merging mainline changes into the branch (but obviously never merge in the other direction)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondarnirView Question on Stackoverflow
Solution 1 - GitatupalView Answer on Stackoverflow
Solution 2 - GitPeter BrattonView Answer on Stackoverflow
Solution 3 - GitRadon RosboroughView Answer on Stackoverflow
Solution 4 - GitkynanView Answer on Stackoverflow