31

我经常遇到想立即在 SVN 存储库上工作的情况。但一个普通人git svn clone [url]也克隆了整个历史。所以我想加快速度。第一部分是仅将最后一个修订版提取到您的 Git 存储库中。我这样做:

URL=http://google-web-toolkit.googlecode.com/svn/trunk/
REV=`svn info $URL |grep Revision: | awk '{print $2}'`
PROJECT_FOLDER=google-web-toolkit-readonly

git svn clone -r$REV:HEAD $URL $PROJECT_FOLDER

(StackOverflow 文章中的更多信息:“如何 git-svn 克隆 svn 的最后 n 个修订版”

这样我就可以启动并运行并且可以立即工作。但没有历史的本地副本。

问题是,我之后如何从 svn 存储库中获取历史记录?

最好,这可以分批完成,比如 1000 次修订(以相反的顺序)。在这里的任何帮助将不胜感激:)

4

3 回答 3

25

我发现了它是如何做到的。诀窍是不要使用git svn clone. 相反,请单独使用git svn initgit svn fetch。修改示例:

URL=http://google-web-toolkit.googlecode.com/svn/trunk/
REV=`svn info $URL |grep Revision: | awk '{print $2}'`
PROJECT_FOLDER=google-web-toolkit-readonly

mkdir $PROJECT_FOLDER
cd !$ #goes into dir named $PROJECT_FOLDER
git svn init -s $URL #-s implies --stdlayout with /trunk /tags /branches
git svn fetch -r $REV

# hack, hack, hack

# or update history (fetch 50 revisions back each loop
for (( r=$REV; r>0; r-=50 )); 
do 
  git svn fetch -r $r:HEAD
done
于 2009-10-12T21:02:20.710 回答
5

建议的答案都不起作用。git svn fetchwith a revision 只会检索比已克隆的版本更新的版本。您可以使用git svn reset返回到旧版本并从那里检索,但之后您必须做一些肮脏的工作才能将新版本“嫁接”回完整树(git 中 SVN 版本的 SHA1取决于修订的整个父系)。如果您对git提供给您的手术刀很方便,那就去吧。

避免这个问题要容易得多。

  • 对最后几个修订进行初始克隆,以便您可以立即开始工作;
  • 启动另一个完整历史的克隆到另一个目录/git存储库;
  • 尽可能多地在您的部分历史中工作;
  • 完整克隆完成后,使用http://www.sanityinc.com/articles/relocating-git-svn-repositories/之类的方法将您的工作从部分存储库复制到完整存储库。

所以,这是一个部分答案 - 你以后如何获取历史记录?将其获取到另一个仓库并复制您需要的内容。可以以相反的顺序以 1000 块为单位完成吗?用手术刀和很大的耐心,它可以,但它不太值得。向前运行的完整获取将超过您每个块抓取的所有第一次修订的开销,git svn fetch并且修复将变得乏味。

于 2013-03-26T18:57:56.100 回答
0

git svn fetch似乎“记住”了之前看到的修订。我在做范围方面取得了成功:

git svn fetch -r 0:100
git svn fetch -r 100:200
git svn fetch -r 4500
git svn rebase
git svn fetch -r 200:300

我获取了最新的修订版,然后开始“填补”空白。它似乎工作正常。

Jesper——如果你的存储库没有修订版 1000,那么它就没有什么可以获取的了。确保您使用的修订号有效!

于 2010-01-11T19:39:21.730 回答