0

我有一种情况,我正在使用 gitHub 来管理对我从使用 svn 的开源项目中提取的存储库的更改。

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

我基本上有这个大规模的问题。

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

  1. 创建基于 svn 的原始代码的新本地工作副本。
  2. 递归删除此树中的所有非“.svn”文件夹。IE,遇到我的项目树只有“.svn”文件夹及其内容的情况。
  3. 递归删除“gitHub”树中的所有“.svn”文件夹。
  4. 将“.svn”文件夹复制到“gitHub”树

三个问题:

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

2 回答 2

0

通常,不要在目录之间复制 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”的每个文件。

于 2012-07-10T18:26:26.427 回答
0

发现我最初提出的方法效果很好。

采取的步骤

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

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

  • 创建本地 svn 存储库:

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 状态。它将显示
    带有“?”的已删除文件或文件夹 前缀和缺少带有“!”的文件或文件夹 字首。将列表保存到外部文件并使用查找和替换将它们分别更改为“svn add”和“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"

于 2012-07-10T20:23:11.740 回答