git-svn very slow on fetch (shared git-svn repo)

5 messages, 2 authors, 2016-06-15 · open the first message on its own page

git-svn very slow on fetch (shared git-svn repo)

From: Pascal Obry <hidden>
Date: 2016-06-15 22:47:30

Here is the problem.

Doing a:

    $ git svn fetch

Takes age to update the repository. The long story is that I'm trying to 
have shared git-svn repositories.

I'm cloning the repository on a server using a standard "git svn clone". 
I then let users cloning this repository using the procedure described 
in git-svn help. Copy/paste here:

<<
        # Do the initial import on a server
                ssh server "cd /pub && git svn clone 
http://svn.example.com/project
        # Clone locally - make sure the refs/remotes/ space matches the 
server
                mkdir project
                cd project
                git init
                git remote add origin server:/pub/project
                git config --add remote.origin.fetch 
'+refs/remotes/*:refs/remotes/*'
                git fetch
        # Create a local branch from one of the branches just fetched
                git checkout -b master FETCH_HEAD
        # Initialize 'git svn' locally (be sure to use the same URL and 
-T/-b/-t options as were used on server)
                git svn init http://svn.example.com/project
        # Pull the latest changes from Subversion
                git svn rebase
 >>

If you do a "git svn fetch" (to get new branches) it takes age if you 
have imported branches that are not used since a long time.

I've traced this down to the Perl fetch_all procedure. It seems that the 
fetch is looking at the older version in all branches and then read the 
remote repository starting from this revision. As some branches are 
unused since a very long it it re-read most of the history. In my 
example it start at rev 8200 whereas the last revision on trunk is 
150000 (I put trace in git-svn Perl script).

I have observed that this happen only the first time.

This can be confirmed by the fact that if you break git-svn fetch 
process and restart it it will start to a later revision. So it seems 
that git-svn is keeping some kind of data about what has already been 
fetched but those data are not properly copied by the procedure above.

Is there a workaround that? Where are those data stored?

Any guidance would be very welcomed.

Thanks,
Pascal.

-- 

--|------------------------------------------------------
--| Pascal Obry                           Team-Ada Member
--| 45, rue Gabriel Peri - 78114 Magny Les Hameaux FRANCE
--|------------------------------------------------------
--|    http://www.obry.net  -  http://v2p.fr.eu.org
--| "The best way to travel is by means of imagination"
--|
--| gpg --keyserver keys.gnupg.net --recv-key F949BD3B

Re: git-svn very slow on fetch (shared git-svn repo)

From: Eric Wong <hidden>
Date: 2016-06-15 22:47:30

Pascal Obry [off-list ref] wrote:
Here is the problem.

Doing a:

   $ git svn fetch

Takes age to update the repository. The long story is that I'm trying to  
have shared git-svn repositories.

I'm cloning the repository on a server using a standard "git svn clone".  
I then let users cloning this repository using the procedure described  
in git-svn help. Copy/paste here:

<<
       # Do the initial import on a server
               ssh server "cd /pub && git svn clone  
http://svn.example.com/project
       # Clone locally - make sure the refs/remotes/ space matches the  
server
               mkdir project
               cd project
               git init
               git remote add origin server:/pub/project
               git config --add remote.origin.fetch  
'+refs/remotes/*:refs/remotes/*'
               git fetch
       # Create a local branch from one of the branches just fetched
               git checkout -b master FETCH_HEAD
       # Initialize 'git svn' locally (be sure to use the same URL and  
-T/-b/-t options as were used on server)
               git svn init http://svn.example.com/project
       # Pull the latest changes from Subversion
               git svn rebase
quoted
quoted
If you do a "git svn fetch" (to get new branches) it takes age if you  
have imported branches that are not used since a long time.

I've traced this down to the Perl fetch_all procedure. It seems that the  
fetch is looking at the older version in all branches and then read the  
remote repository starting from this revision. As some branches are  
unused since a very long it it re-read most of the history. In my  
example it start at rev 8200 whereas the last revision on trunk is  
150000 (I put trace in git-svn Perl script).

I have observed that this happen only the first time.

This can be confirmed by the fact that if you break git-svn fetch  
process and restart it it will start to a later revision. So it seems  
that git-svn is keeping some kind of data about what has already been  
fetched but those data are not properly copied by the procedure above.

Is there a workaround that? Where are those data stored?
Hi Pascal,

For globs (branches and tags) the $GIT_DIR/svn/.metadata
config file, under the svn-remote.svn.{branches,tags}-maxRev keys.

For explicitly specified refs (e.g. "trunk"), then it's in the last
record of the corresponding rev_map (e.g.
$GIT_DIR/svn/trunk/.rev_map.$UUID) as a 4-byte revision number + 20
bytes of zeroes.

-- 
Eric Wong

Re: git-svn very slow on fetch (shared git-svn repo)

From: Pascal Obry <hidden>
Date: 2016-06-15 22:47:30

Hi Eric,
For globs (branches and tags) the $GIT_DIR/svn/.metadata
config file, under the svn-remote.svn.{branches,tags}-maxRev keys.
Right. I found out that copying the .metadata solve this problem.
For explicitly specified refs (e.g. "trunk"), then it's in the last
record of the corresponding rev_map (e.g.
$GIT_DIR/svn/trunk/.rev_map.$UUID) as a 4-byte revision number + 20
bytes of zeroes.
Seems like we do not need to copy this one as it is reconstructed by a 
simple rebase on the trunk branch. This is quite fast as reconstructed 
from the embedded git-svn-id if I'm not mistaken.

So you confirm that copying the .metadata is the solution?

Pascal.

-- 

--|------------------------------------------------------
--| Pascal Obry                           Team-Ada Member
--| 45, rue Gabriel Peri - 78114 Magny Les Hameaux FRANCE
--|------------------------------------------------------
--|    http://www.obry.net  -  http://v2p.fr.eu.org
--| "The best way to travel is by means of imagination"
--|
--| gpg --keyserver keys.gnupg.net --recv-key F949BD3B

Re: git-svn very slow on fetch (shared git-svn repo)

From: Eric Wong <hidden>
Date: 2016-06-15 22:47:30

Pascal Obry [off-list ref] wrote:
Hi Eric,
quoted
For globs (branches and tags) the $GIT_DIR/svn/.metadata
config file, under the svn-remote.svn.{branches,tags}-maxRev keys.
Right. I found out that copying the .metadata solve this problem.
quoted
For explicitly specified refs (e.g. "trunk"), then it's in the last
record of the corresponding rev_map (e.g.
$GIT_DIR/svn/trunk/.rev_map.$UUID) as a 4-byte revision number + 20
bytes of zeroes.
Seems like we do not need to copy this one as it is reconstructed by a  
simple rebase on the trunk branch. This is quite fast as reconstructed  
from the embedded git-svn-id if I'm not mistaken.

So you confirm that copying the .metadata is the solution?
Yes, copying .metadata should be enough.  The .rev_map rebuild should
be fast.

-- 
Eric Wong

Re: git-svn very slow on fetch (shared git-svn repo)

From: Pascal Obry <hidden>
Date: 2016-06-15 22:47:30

Eric,
Yes, copying .metadata should be enough.
I've put this in place. Works fine.

 > The .rev_map rebuild should be fast.

Yep. Thanks for your quick reply.

Pascal.

-- 

--|------------------------------------------------------
--| Pascal Obry                           Team-Ada Member
--| 45, rue Gabriel Peri - 78114 Magny Les Hameaux FRANCE
--|------------------------------------------------------
--|    http://www.obry.net  -  http://v2p.fr.eu.org
--| "The best way to travel is by means of imagination"
--|
--| gpg --keyserver keys.gnupg.net --recv-key F949BD3B
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help