[Git-fu] How to commit inter-repositories atomically to svn

Sean Silva asked me, "How are you committing across both projects
simultaneously?"

For example, r167595.
http://llvm.org/viewvc/llvm-project?view=rev&revision=167595

For the record, I introduce a how-to.
Yeah it's troublesome. I don't do usually.

[Prerequisites]

* subtree-merged git repo. https://github.com/chapuni/llvm-project
* Assume you are working on llvm-project.
* You are about to commit to both llvm and clang.
* Of course, you are a developer capable to commit llvm.org/svn.

[How to make commit from by-project git repos]

* Checkout tracking branch on llvm-project.
  $ git checkout --track origin/master
* Collect your commits with squashed.
    $ git fetch /path/to/your/repo (.git)
    $ git cherry-pick --strategy subtree --no-commit FETCH_HEAD
  $ git commit
  You may do whatever you want.
  FYI, it could be easily to add your repositories to
GIT_DIR/objects/info/alternates.

[Preparations]

* Checkout latest head of upstream as detached.
  $ git fetch origin
  $ git checkout origin/master
* Set up svn-emulated tree.
  $ for x in *;do git mv $x trunk;mkdir $x;git mv trunk $x/;done
    Imagine, clang => cfe/trunk, llvm => llvm/trunk.
  $ git mv clang/trunk cfe/trunk
  $ git commit
  Then you can see the tree like llvm.org/svn/llvm-project.
* Pick up you commit
  $ git cherry-pick --strategy subtree master (or certain sha1)

[Committing...]
  $ git svn commit-diff -rHEAD HEAD^ HEAD https://llvm.org/svn/llvm-project
  If HEAD is not tree but commit, git-svn uses corresponding commit
message in HEAD.

It could be done without working tree, to assemble commit object(s)
and tree(s) with plumbing. I could provide an express script if anyone
requested me. (TBD)

Feel free to ask me wherever I am, the list or the IRC, oftc#llvm.

HTH, Takumi