mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
![Deskin Miller](/assets/img/avatar_default.png)
Suppose you're using git-svn to work with a certain SVN repository. Since you don't like 'git-svn fetch' to take forever, and you don't want to accidentally interrupt it and end up corrupting your repository, you set up a remote Git repository to mirror the SVN repository, which does its own 'git-svn fetch' on a cronjob; now you can 'git-fetch' from the Git mirror into your local repository, and still dcommit to SVN when you have changes to push. After you do this, though, git-svn will get very confused if you ever try to do 'git-svn fetch' in your local repository again, since its rev_map will differ from the branch's head, and it will be unable to fetch new commits from SVN because of the metadata conflict. But all the necessary metadata are there in the Git commit message; git-svn already knows how to rebuild rev_map files that get blown away, by using the metadata. This patch teaches git-svn do a partial rebuild of the rev_map to match the true state of the branch, if it ever is used to fetch again. This will only work for projects not using either noMetadata or useSvmProps configuration options; if you are using these options, git-svn will fall back to the previous behaviour. Signed-off-by: Deskin Miller <deskinm@umich.edu> Acked-by: Eric Wong <normalperson@yhbt.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
60 lines
1.2 KiB
Bash
Executable file
60 lines
1.2 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2008 Deskin Miller
|
|
#
|
|
|
|
test_description='git svn partial-rebuild tests'
|
|
. ./lib-git-svn.sh
|
|
|
|
test_expect_success 'initialize svnrepo' '
|
|
mkdir import &&
|
|
(
|
|
cd import &&
|
|
mkdir trunk branches tags &&
|
|
cd trunk &&
|
|
echo foo > foo &&
|
|
cd .. &&
|
|
svn import -m "import for git-svn" . "$svnrepo" >/dev/null &&
|
|
svn copy "$svnrepo"/trunk "$svnrepo"/branches/a \
|
|
-m "created branch a" &&
|
|
cd .. &&
|
|
rm -rf import &&
|
|
svn co "$svnrepo"/trunk trunk &&
|
|
cd trunk &&
|
|
echo bar >> foo &&
|
|
svn ci -m "updated trunk" &&
|
|
cd .. &&
|
|
svn co "$svnrepo"/branches/a a &&
|
|
cd a &&
|
|
echo baz >> a &&
|
|
svn add a &&
|
|
svn ci -m "updated a" &&
|
|
cd .. &&
|
|
git svn init --stdlayout "$svnrepo"
|
|
)
|
|
'
|
|
|
|
test_expect_success 'import an early SVN revision into git' '
|
|
git svn fetch -r1:2
|
|
'
|
|
|
|
test_expect_success 'make full git mirror of SVN' '
|
|
mkdir mirror &&
|
|
(
|
|
cd mirror &&
|
|
git init &&
|
|
git svn init --stdlayout "$svnrepo" &&
|
|
git svn fetch &&
|
|
cd ..
|
|
)
|
|
'
|
|
|
|
test_expect_success 'fetch from git mirror and partial-rebuild' '
|
|
git config --add remote.origin.url "file://$PWD/mirror/.git" &&
|
|
git config --add remote.origin.fetch refs/remotes/*:refs/remotes/* &&
|
|
git fetch origin &&
|
|
git svn fetch
|
|
'
|
|
|
|
test_done
|