修复被覆盖的svn文本库等



我有一种情况,我使用gitHub来管理从使用svn的开源项目中提取的repo的更改。

一切都很好,直到我意识到在使用sed更改内容时,我已经更改了svn跟踪文件。有太多需要手动修复。

我基本上有一个大范围的问题。

我需要这些完好无损,所以我想我会做以下事情:

  1. 创建一个新的基于svn的原始代码的本地工作副本
  2. 递归删除此树中的所有非".svn"文件夹。也就是说,我的项目树中只有".svn"文件夹及其内容
  3. 递归删除"gitHub"树中的所有".svn"文件夹
  4. 跨".svn"文件夹复制到"gitHub"树

三个问题:

  • 这样做明智吗
  • 如果没有,关于如何恢复svn的东西有什么建议吗
  • 如果在正确的轨道上,我如何实现步骤2?即,递归删除除".svn"文件夹以外的所有内容?我发现了很多垃圾在谷歌上做第三步,但这是这些的翻转

通常,不要在目录之间复制Subversion元数据文件夹。以这种方式做事很容易遇到麻烦。

相反,请尝试创建一个脚本,以恢复对Subversion元数据所做的更改。可以使用命令find . -name .svn -exec some_command '{}' +查找所有Subversion元数据文件夹,并对其运行命令。将some_command替换为任何需要递归恢复到上一个已知工作状态的git命令。

另一种选择是在最后一个已知的工作状态下创建一个分支。从该分支工作,合并所有更改,但对元数据文件夹的更改除外。根据元数据损坏后的时间长短,这可能是一种更容易的方法。

还要注意,如果您使用的是Subversion 1.7,这会更容易一些,因为每个工作副本只有一个.svn文件夹,而不是每个目录一个。在这种情况下,使用find可能有点过头了。

如果您需要删除除".svn"文件夹之外的所有内容,请尝试命令find $folder -type f | grep -v '.svn' | xargs rm -f。这将删除当前目录中所有路径中没有".svn"的文件(递归到子目录中)。

发现我最初提出的方法运行得很好。

采取的步骤

  • 创建等效于"gitrepos"的"svnrepos"以具有两个子保存实际repo和原始文件集的目录:

mkdir /home/build/REPOS/svnrepos && mkdir /home/build/REPOS/svnrepos/repos && mkdir /home/build/REPOS/svnrepos/files

  • 创建本地svn repo:

cd /home/build/REPOS/svnrepos/repos && svnadmin create project_name

  • 获取原始源文件。这将取消标记为"项目名称":

cd /home/build/REPOS/svnrepos/files && wget http://site.net/project_name.tar.gz && tar -xzf project_name.tar.gz

  • 将原始源文件导入到新的本地repo中:

svn import /home/build/REPOS/svnrepos/files/project_name file:///home/build/REPOS/svnrepos/repos/project_name -m "Initial import of project_name"

  • 重命名现有的"GIT_Project"文件夹,因为我们将使用此名称临时svn工作文件夹:

cd /home/build/REPOS/gitrepos && mv GIT_Project GIT_Project_git

  • 创建新的"GIT_Project"文件夹并将svn repo签入其中:

mkdir GIT_Project && svn co file:///home/build/REPOS/svnrepos/repos/project_name /home/build/REPOS/gitrepos/GIT_Project

  • 递归删除新的临时svn工作文件夹中的每个文件它不在".svn"目录树下。离开文件夹结构完好无损:

cd /home/build/REPOS/gitrepos/GIT_Project && find . -type f | grep -v '.svn' | xargs rm -f

  • 递归删除原始git版本中的每个".svn"文件夹文件夹:

cd /home/build/REPOS/gitrepos/GIT_Project_git && rm -rf查找-键入d-name.svn`

  • 从截断的临时svn工作文件夹创建一个tar文件:

cd /home/build/REPOS/gitrepos && tar -czf svn.tgz GIT_Project

  • 删除临时svn工作文件夹:

rm -fr GIT_Project

  • 将git-version文件夹重命名回其原始名称:

mv GIT_Project_git GIT_Project

  • 解压缩截断的临时svn工作文件夹tar文件以添加已将".svn"文件夹和内容更新到git版本文件夹:

tar -xzkf svn.tgz

  • 获取git-version文件夹的svn状态。它将显示已删除
    带有"?"的文件或文件夹前缀和缺少的文件或文件夹a"!"前缀将列表保存到外部文件,然后使用find和replace将其分别更改为"svn-add"one_answers"svn-delete"。请记住跳过不应添加到的文件和文件夹svn:

cd GIT_Project && svn status

  • 使用修改后的svn状态输出来更新svn:

svn add fileORfolder_1 && svn add fileORfolder_2 ... && svn add fileORfolder_n

svn delete fileORfolder_1 && svn delete fileORfolder_2 ... && svn delete fileORfolder_n

svn commit -m "Realign svn and git"

最新更新