Using git, how do I ignore a file in one branch but have it committed in another branch?
git, gitignore
Solution
This solution appears to work only for certain, patched versions of git. See a new answer pointing to workarounds and another answer and subsequent comments for a hint which versions may work.
I wrote a blog post on how to effectively use the `excludesfile` for different branches, like one for public github and one for heroku deployment.
Here's the quick and dirty:
$ git branch public_viewing
$ cd .git/
$ touch info/exclude_from_public_viewing
$ echo "path/to/secret/file" > info/exclude_from_public_viewing
then in the .git/config file add these lines:
[core]
excludesfile = +info/exclude
[branch "public_viewing"]
excludesfile = +info/exclude_from_public_viewing
Now all the global ignore stuff is in the `info/exclude` file and the branch specific is in the `info/exclude_from_public_viewing`
http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches
Problem
I've got a project that I'm deploying to Heroku. The source code tree includes a bunch of mp3 files (the website will be for a recording project I was heavily involved with). I'd like to put the source code for it up on GitHub, but GitHub has a 300 MB limit on their free accounts. I don't want to use 50 MB of my limit on a bunch of mp3 files. Obviously, I could add them to the `.gitignore` file to keep them out of my repo. However, I deploy to Heroku using `git push heroku`. The mp3 files must be present in the branch I push to Heroku so that they get get deployed. Ideally, I'd like to `.gitignore` the mp3 files in my local master branch so that when I push that to GitHub, the mp3s are not included. Then I'd keep a local production branch that has the mp3s committed rather than ignored. To deploy, I would merge master into production, and then push the production branch to Heroku. I can't get this to work right. Here's an example of what I'm trying to do... ``` $ git init git-ignore-test $ cd git-ignore-test $ echo "*.ignored" >> .gitignore $ git add .gitignore && git commit -m "Ignore .ignored files" $ touch Foo.ignored ``` At this point, Foo.ignored is ignored in my master branch, but it's still present, so my project can use it. ``` $ git checkout -b unignored $ cat /dev/null > .gitignore $ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files" ``` Now I've got a branch with these files committed, as I want. However, when I switch back to my master branch, Foo.ignored is gone. Anyone got any suggestions for a better way to set this up? Edit: just to clarify, I want the mp3 files to be present in both branches so that when I run the site locally (using either branch) the site works. I just want the files ignored in one branch so when I push to GitHub they are not pushed as well. Usually .gitignore works well for this kind of thing (i.e. keeping a local copy of a file that does not get included in a push to a remote), but when I switch to the branch with the files checked in, and then back to the branch with the files ignored, the files vanish.