修复覆盖的svn文本库等

时间:2012-07-10 17:49:33

标签: bash svn unix

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

在我意识到使用sed更改内容之前,一切都很顺利,我已经更改了svn跟踪文件。手动修复太多了。

我基本上都有this problem

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

  1. 创建基于pristine svn的代码的新本地工作副本。
  2. 以递归方式删除此树中的所有非“.svn”文件夹。 I.E.,进入我的项目树只有“.svn”文件夹及其内容的情况。
  3. 以递归方式删除“gitHub”树中的所有“.svn”文件夹。
  4. 将“.svn”文件夹复制到“gitHub”树
  5. 三个问题:

    • 这是可取的吗?
    • 如果没有,有关如何恢复svn内容的任何建议吗?
    • 如果在正确的轨道上,我该如何实现第2步? I.E.,递归 删除除“.svn”文件夹之外的所有内容?我找到了很多东西 在谷歌上做第3步,但这只是其中的一步。

2 个答案:

答案 0 :(得分:0)

通常,不要在目录之间复制Subversion元数据文件夹。 非常 很容易因此而陷入困境。

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

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

另请注意,如果您使用Subversion 1.7,这会更容易一些,因为每个工作副本只有一个.svn文件夹,而不是每个目录一个。{1}}文件夹。在这种情况下,使用find可能有点矫枉过正。

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

答案 1 :(得分:0)

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

采取的步骤

  • 创建'svnrepos'相当于'gitrepos'有两个子 用于保存实际repo和pristine文件集的目录:

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

  • 抓取原始源文件。这将解释为'project_name':

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

  • 将原始源文件导入新的本地仓库:

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找到。 -type d -name .svn`

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

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

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

rm -fr GIT_Project

  • 将git版本文件夹重命名为其原始名称:

mv GIT_Project_git GIT_Project

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

tar -xzkf svn.tgz

  • 获取git版本文件夹的svn状态。它会显示已删除的 带有'?'的文件或文件夹前缀和丢失的文件或文件夹 一个 '!'字首。将列表保存到外部文件并使用find和 替换将这些分别更改为“svn add”和“svn delete”。 记得跳过不应添加的文件和文件夹 的svn:

cd GIT_Project && svn status

  • 使用修改后的svn status输出更新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"