GIT - how to keep a file common across all branches
git, version-control
Solution
You could use a post-checkout hook:
#!/bin/sh
newref="$2"
isbranch="$3"
# ignore file checkouts
if test $isbranch -eq 0; then
exit 0
fi
path=ChangeLog
git for-each-ref --sort=-committerdate \
--format='%(objectname) %(refname:short)' \
refs/heads/\* |
while read sha ref; do
if git rev-parse --verify --quiet "$sha:$path" >/dev/null
then
if test "$newref" != "$sha"; then
echo Checking out $path from $ref
git checkout $sha -- "$path"
fi
break
fi
done
It will still be up to you to add and commit the `ChangeLog` on your branch if appropriate.
This hook sorts branches by their heads' respective commit dates, which could be problematic. Say you create a topic branch rooted at a commit in master's history. Even though its snapshot of `ChangeLog` is older in the sense of calendar time, the hook above will treat it as the newest because it is referenced by a commit that was created more recently, so be careful that you don't accidentally lose work by switching branches when you have unstaged changes to `ChangeLog`.
Problem
Suppose I have a file "ChangeLog" in branch "master". I want to record information about all changes in any branch in this file (in more detail than in a commit message and with other descriptive information). I `git checkout -b revA`, perform edits, update ChangeLog and `git commit`. I then `git checkout -b master`. This checkout will replace ChangeLog with the version in branch "master". What I would like is for ChangeLog to automagically be the most recently modified version irrespective of which branch I've checked out. I don't want to manually merge (or, most likely, forget to merge) ChangeLog from some other branch into my current branch. I haven't found anything which seems to allow this. Is it possible to do this?