From: Jeff King <peff@peff.net>
To: Aneesh Bhasin <contact.aneesh@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: Adding a new file to all git branches
Date: Tue, 24 Mar 2009 02:31:31 -0400 [thread overview]
Message-ID: <20090324063131.GA28636@coredump.intra.peff.net> (raw)
In-Reply-To: <f662f0210903232041p6f86b882of7b2d708946ea905@mail.gmail.com>
On Tue, Mar 24, 2009 at 09:11:15AM +0530, Aneesh Bhasin wrote:
> I was wondering if it is possible to add a file to all the branches in
> a repository without individually checking out each branch ?
>
> A possible use-case for such a scenario is say I have a git repository
> with various branches related to different features, versions or
> bug-fixes and I want to be able to add a README file which contains
> instructions/information common to all of those branches as of now
> (but may diverge in future). So, do I have to checkout each branch
> individually to add the same README file to all of them or is there a
> direct/indirect workaround ?
Not really.
You basically have three options:
1. branch a new "README" line of development from some common ancestor
of all branches, add the README, and then merge this new branch into
your other branches
The advantage of this approach is that you could actually keep the
README branch around, making changes to it and merging it back into
your other branches as appropriate.
Of course, you asked about avoiding "checkout", and you will still
have to checkout each branch to do the merge.
2. For a one-off addition of such a README, it is probably simpler to
just use a for loop with checkout:
for i in branch1 branch2 branch3; do
git checkout $i &&
cp /path/to/README . &&
git add README &&
git commit -m 'add README'
done
Which again, obviously does checkout, but at least it's
non-interactive. The biggest downside is that doing a full checkout
between branches might be slow.
3. You could also just iterate over the branches with plumbing, adding
the README to each tree. Something like:
hash=`git hash-object -w /path/to/README`
for i in b1 b2 b3; do
GIT_INDEX_FILE=index.$i; export GIT_INDEX_FILE
git read-tree $i &&
git update-index --add --cacheinfo 100644 $hash README &&
tree=$(git write-tree) &&
parent=$(git rev-parse $i) &&
commit=$(echo added README | git commit-tree $tree -p $parent) &&
git update-ref -m "commit: added README" refs/heads/$i $commit $parent
rm $GIT_INDEX_FILE
sleep 1
done
This is going to be faster, but obviously is much more complicated.
For a one-off addition, I would probably just do (2).
-Peff
prev parent reply other threads:[~2009-03-24 6:34 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-24 3:41 Adding a new file to all git branches Aneesh Bhasin
2009-03-24 6:31 ` Jeff King [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090324063131.GA28636@coredump.intra.peff.net \
--to=peff@peff.net \
--cc=contact.aneesh@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).