如果删除.svn文件夹而不丢失历史记录,如何更新svn项目

时间:2014-01-27 17:52:24

标签: git svn version-control

我为code.google项目做了svn checkout(git svn clone,我不记得了),并开始使用git。

我在master git分支中保留了原始项目,并在名为threadSafe的附加分支中完成了所有更改。但是,我没有.svn文件夹了。

现在,我需要更新项目并从原始项目中获取更改而不会丢失我的更改。所以,从svn项目更新我的git master分支,然后合并git分支。

如果删除.svn文件夹,可以这样做吗?类似于svn update

我在stackoverflow中读到“你可以在同一个地方再次结账,如果没有新的更新,svn将对你的所有文件进行版本化而不下载。”我尝试了这个,但它没有用,因为它收到一条消息,说有同名的文件夹。

关于@ flopo建议的最佳镜头是: 1.使用svn再次检出项目到另一个位置。 2.将新结帐复制到我的代码上,覆盖文件。 3.现在我拥有带有最新版本的git master分支和带有我的更改的threadSafe git分支。使用git合并分支。

但是,如果我这样做,我将失去svn存储库的历史记录。 Becasue我根据git出现了所有变化的作者。

谢谢!

6 个答案:

答案 0 :(得分:1)

  1. 使用SVN再次将项目签出到其他位置。

  2. 将代码复制到此新结帐中,覆盖文件。

  3. 现在您可以同步代码.svn文件夹。

答案 1 :(得分:1)

使用--force选项进行结帐。

来自SVN 1.7 checkout documentation

  

在版本1.7之前,如果您尝试,Subversion会默认投诉   检查包含的现有目录顶部的目录   结帐本身将创建的文件或子目录。   Subversion 1.7以不同的方式处理这种情况,允许   结帐继续,但将任何障碍物标记为树   冲突。使用--force选项覆盖此安全措施。什么时候   你可以使用--force选项查看任何未版本控制的文件   通常会妨碍结账的结账目标树   仍然会变成版本,但Subversion将保留其内容   原样。如果这些内容与该路径中的存储库文件不同   (作为结帐的一部分下载),文件将出现   进行局部修改 - 改变所需的变化   您检出的版本化文件到您拥有的无版本文件中   在退房之前 - 结账时间结束。

答案 2 :(得分:0)

删除.svn文件夹后,您无法进行更新,因为您没有所需的信息。

我担心你必须在另一个目录上进行新的结账。您无法使用现有文件在目录中结帐。

答案 3 :(得分:0)

在新文件夹中签出您的存储库,然后将根.svn目录复制到旧的根文件夹中。这应该有用。

答案 4 :(得分:0)

如果您运行svn status命令,并且看到带有“!”的文件夹或文件在他们面前,请按照以下步骤纠正问题:

$ svn status
!       foo/
$ svn update foo/
$ git checkout -- foo/
$ svn status

现在你的.svn目录应该回来了,当你运行svn status时,事情正确地显示为已修改或删除。

重要!如果您还没有,首先要将.svn添加到.gitignore文件中。

答案 5 :(得分:0)

当然,有一种更好的方法可以做到这一点但我可以通过创建一个中间存储库将最新更新的svn存储库更新到我的git存储库。像这样做我可以保留原始项目中的历史树。

(谢谢你的所有答案)

//Clone the svn repository using git svn and upload as a new github repository
cd src
git svn clone http://XX.googlecode.com/svn/trunk/model XX_svn
cd XX_svn
git remote add origin git@github.com:account/XX_svn.git
git push -u origin master

//add a new remote into my git project to fetch from XX_svn
cd ../XX
git remote add svnClone git://github.com/account/XX_svn.git   
git fetch svnClone
* [new branch]      master     -> svnClone/master

//merge changes as needed: merge the latest changes from the remote project to my master branch (that was an out of data copy of the original project) 
git checkout master
git merge svnClone/master

//Now, I have the latest changes from the svn repository in my git master branch --> I  can merge or cherry pick as needed. For example

git checkout thread-safe
git merge master