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

git-svn: Trouble after project has moved in svn

From
JZJukka Zitting <jukka.zitting@gmail.com>
Date
Jul 16, 2008, 22:12 UTC
Message-ID
<510143ac0807161512w44a612bcndc53713639b0b70a@mail.gmail.com>
Hi,

Somewhat related to the recent thread about Apache Synapse, I'm having trouble making a git-svn clone of a project that has been moved around in a Subversion repository.

See the script at the end of this message for a simple test case that does the following svn commits:

    PREPARE: creates projectA with the standard trunk,branches,tags structure
    VERSION1: first version of README.txt in projectA/trunk
    TAG1: tags projectA/trunk to projectA/tags/v1
    MOVE: moves projectA to projectB
    VERSION2: second version of README.txt in projectB/trunk
    TAG2: tags projectB/trunk to projectB/tags/v2
The resulting repository structure is:
    /projectB/
        trunk/
            README.txt # version 2
        branches/
        tags/
            v1/
                README.txt # version 1
            v2/
                README.txt # version 2
Here's the git commit graph created by the test case:
    * TAG2 <- refs/remotes/tags/v2
    | * VERSION2 <- refs/remotes/trunk
    |/
    * MOVE
    * VERSION1 <- refs/remotes/trunk@3
    | * MOVE <- refs/remotes/tags/v1
    | * TAG1 <- refs/remotes/tags/v1@3
    |/
    * PREPARE <- refs/remotes/tags/v1@1

The most pressing issue is that the refs/remotes/tags/v1 branch starts directly from the first PREPARE commit instead of VERSION1. Also, the branch point of refs/remotes/tags/v2 seems to be incorrect, it should be based on the VERSION2 commit instead of MOVE.

A more accurate commit graph would be:
    * TAG2 <- refs/remotes/tags/v2
    * VERSION2 <- refs/remotes/trunk
    * MOVE
    | * MOVE <- refs/remotes/tags/v1
    | * TAG1
    |/
    * VERSION1
    * PREPARE

Or even (but I guess git-svn needs to map each svn commit to at least one git commit, so this probably wouldn't work):

    * VERSION2 <- refs/remotes/trunk, refs/remotes/tags/v2
    * VERSION1 <- refs/remotes/tags/v1
    * PREPARE

I tried working my way through git-svn.perl to figure out how to improve the way git-svn tracks svn moves, but so far I couldn't figure out how to do that. Any ideas or hints?

BR,
Jukka Zitting

===== #!/bin/sh

REPO=`pwd`/repo svnadmin create $REPO

svn checkout file://$REPO checkout cd checkout

svn mkdir projectA svn mkdir projectA/trunk svn mkdir projectA/branches svn mkdir projectA/tags svn commit -m PREPARE

echo VERSION1 > projectA/trunk/README.txt svn add projectA/trunk/README.txt svn commit -m VERSION1

svn copy projectA/trunk projectA/tags/v1 svn commit -m TAG1 svn update

svn move projectA projectB svn commit -m MOVE

echo VERSION2 > projectB/trunk/README.txt svn commit -m VERSION2

svn copy projectB/trunk projectB/tags/v2 svn commit -m TAG2 svn update

mkdir ../git cd ../git

git svn init -s file://$REPO/projectB git svn fetch

Next: Michael J Gruber
Message 1 of 3 in “git-svn: Trouble after project has moved in svn”
  1. Jukka ZittingJul 16, 2008
  2. Michael J GruberJul 17, 2008
  3. Jukka ZittingJul 18, 2008

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.