我有一个目前正在使用Subversion的存储库,但我想在本地使用Git。所以我用git-svn检查了它:
git svn clone http://localserver/svn/repo
现在,在回购中,我有几个目录:
repo/
trunk/
A/
B/
C/
tags/
branches/
存储库目前处于修订版100.我想在repo/trunk/B
内签出修订版90,然后为整个仓库制作一个标记,以便repo/trunk/A
为rev 100,{{1} }是rev 90,repo/trunk/B
是rev 100。
在svn我会做
repo/trunk/C
是否有使用git-svn的等价物,然后我可以制作一个标记来捕获当时整个存储库的状态吗?
我试过了:
cd repo/trunk/B
svn update -r90 .
据我所知,cd repo/trunk/B
git svn find-rev r90 # yields 18376729f51b71212d94dcba239a2482cda9f3c8
git checkout 18376729f51b71212d94dcba239a2482cda9f3c8 .
中的文件已根据repo/trunk/B
更改,但其他子目录中的文件未更改。这是正确的方法吗,还是有更“正确”的方式?
答案 0 :(得分:1)
如上所述,您可以使用git checkout
手动为trunk/B
中的文件执行此操作。但是,文件内容现在将显示为已修改,如果您运行git commit
,则会将旧文件的内容重新提交为新文件。
这通常不是git的运作方式,而且我冒昧地说这通常不是你真正想要用svn做的。使用git,您希望整个工作树以锁步方式一起移动,因此,大多数情况下不支持部分检出或将子树更新为不同版本。
当出现这种情况时,您应该问自己A
,B
和C
是否真的是不同的“项目”。标记时,是否将它们标记在一起,或者只是将A
的文件与B
分开标记?分支怎么样?我发现git repos在包含项目所需的所有文件时效果最好,但不超过这个。将存储库限制到项目级别会增加一些簿记,但也有助于提高灵活性。这就是为什么你会看到许多关于StackOverflow的帖子讨论使用git子模块和子树(两个不同的概念)来管理存储库组。