git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Adding a new file to all git branches

From
Jeff King <peff@peff.net>
Date
Mar 24, 2009, 06:31 UTC
Message-ID
<20090324063131.GA28636@coredump.intra.peff.net>
In-Reply-To
<f662f0210903232041p6f86b882of7b2d708946ea905@mail.gmail.com>
On Tue, Mar 24, 2009 at 09:11:15AM +0530, Aneesh Bhasin wrote:
Show 10 quoted lines
> 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
Previous: Aneesh Bhasin
Message 2 of 2 in “Adding a new file to all git branches”
  1. Aneesh BhasinMar 24, 2009
  2. Jeff KingMar 24, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.