Git: how to add a file but not track it
This question already has an answer here:
Git ignore files being tracked WITHOUT DELETING THEM
2 Solutions collect form web for “Git: how to add a file but not track it”
The duplicate identified contains a more robust solution (
git submodules) to this question. This answer is valid, but after further consideration it is not appropriate if you want a team to get the same behaviour in each clone.
Git supports this with the
--assume-unchanged option for
git update-index. This will let you commit the production version of database.php, and have developers update local versions of this file to point to their local resources.
git add database.php git commit git push git update-index --assume-unchanged database.php
When/if you need to make changes to the production version of database.php:
git update-index --no-assume-unchanged database.php git commit -a git update-index --assume-unchanged database.php
Also each developer will need to run
git update-index --assume-unchanged database.php if the want this too as this command only affects the local repository.
You will want to ensure by some other mechanism that
database.php fails for developers fails on non-production machines – don’t want developers pointing to production obviously 🙂
Note you will need to remove the database.php file from your ignore list before you can add it.
It is a really bad idea to add a file to a repository under version control and then asking git not to track any changes to the file. Files which are added under version control are meant to be versioned and tracked, and if you do not want to track any changes to a file, the rule of the thumb is DO NOT add it in the first place.
Agreed that people have their own preferences, and git supports these workflows to some extent as well, but you would rarely see people using it, and would favor much cleaner and straight-forward solutions instead. In fact the use case which the OP is requesting (adding a file under version control and make git to stop tracking any changes to the file, and make this possible for all future clones/fetches/pulls), is not directly feasible in
git at all.
.gitignore is used for excluding files from accidentally going under version control and also for git not listing any changes to it in commands like
git status. But if a file already exists under version control, git does not care if that file is part of
.gitignore and starts tracking changes to it.
Instead I would recommend that you add a template file called
database-template.php and make every user create a copy of it as
database.php and input his/her changes into it. You could also probably write a simple script which does that.
Along with that, add
database.php to your
.gitignore and you’re good to go, so that the user’s local copy does not get into version control.
There is another way to do this, but each developer should do it his local repo, and this is really a bad approach IMO:
# Ask git to stop tracking any changes to database.php git update-index --assume-unchanged database.php # If you want to start tracking changes again to database.php git update-index --no-assume-unchanged database.php