繁体   English   中英

将 SVN 结帐转换为使用 git (git-svn)

[英]Convert an SVN checkout to use git (git-svn)

我使用保存在 svn 中的软件进行版本控制。 我想使用 git (git-svn) 但是该软件需要大量设置和配置才能使用。 有一些工具可以处理所有设置,包括通过 svn 检查所有代码。

git-svn 的所有文档(我已经能够找到)都需要使用 git-svn 重新结帐。

有没有办法转换现有的 svn checkout 以便它可以使用 git-svn?

不,一个 git-svn 克隆将整个存储库转换为 git。 SVN 签出没有整个存储库,因此无法从中克隆。 这是从 SVN 或 CVS 切换到分布式系统(如 git)的主要优势。

你可以这样做:

  1. 使用 git-svn 将 SVN 树完全克隆到一个临时目录。 确保使用与现有结帐完全相同的版本。
  2. 将“.git”文件夹从 git-svn checkout 的顶层移动到 SVN checkout 的顶层。
  3. 然后你要么需要告诉 Git 忽略“.svn”目录,要么你可以将它们全部删除。
  4. 删除 git-svn 结帐。
  5. 在那里,现在您可以使用 Git 和 git-svn 操作现有文件。
  6. 做一个“git status”,希望它说没有变化。

我假设您可能想保留历史记录。 但是,如果您(或任何其他偶然发现此页面的人)不需要历史记录,您可以使用此处解释的“导出”功能: https ://stackoverflow.com/a/419475/2437521。

另一种不修改原始 Subversion 工作副本且不需要您复制它的方法是使用补丁:

  1. 使用 git-svn 将您的 Subversion 树完全克隆到一个新目录,该目录将成为 Git 存储库。 确保使用与现有结帐完全相同的版本。 您可以使用git reset --hard :/r<revision>强制它在克隆后成为相同的修订版,其中<revision>是 Subversion 工作副本更新到的修订版(请参阅此处使用svn info )。
  2. cd到您的 Subversion 工作副本。
  3. 使用svn status确保所有新文件都标记为A (或使用svn add添加它们),并且所有已删除的文件都标记为D (或使用svn rm删除它们)。
  4. 运行svn diff >patch.diff创建补丁文件。
  5. patch.diff复制到之前创建的 Git 存储库的顶部。
  6. cd到之前创建的 Git 存储库的顶部。
  7. 运行git apply -p0 patch.diff以将补丁应用到 Git 存储库的工作树上。

现在您可以使用git status完成更改,然后git add / git commit它们保存在本地存储库中。

这似乎有效:

(警告:我没有对此进行足够的测试。请在尝试之前进行备份。)

  1. 用当前的 SVN URL 初始化 git-svn:

     git svn init $(svn info --show-item=url)
  2. 获取 Git 的 SVN HEAD。 不幸的是,这会下载 HEAD 而不是使用本地结帐,但它只下载到.git

     git svn fetch -r HEAD

    git-svn fetch 会抱怨类似

    错误:未跟踪的工作树文件“”将被合并覆盖。

    但是当前提交将对应于 SVN HEAD。 工作目录将保留在原处。

  3. 暂存区现在包含 SVN HEAD; 取消它。

     git reset HEAD -- .

存储库的状态现在应该与您执行git svn clone -r HEAD <URL>然后在顶部应用您的更改相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM