繁体   English   中英

在 SVN 子目录中镜像 git 子目录

[英]Mirroring a git subdirectory in a SVN subdirectory

是的,我知道这里已经有大量的版本控制问题,但没有一个提议的解决方案完全符合我的要求,而且我找不到一种方法来破解它们。 我已经找了一个星期了。

我的设置:

Windows 7 机器(使用 cygwin——虽然我没有针对这个问题接触过它)、远程密码保护的 git repo 和 svn repo。 新项目逐渐从使用 svn 切换到 git(之前没有人用过 git),需要来回打乱代码。

我想要的是:

我和其他几个人应该能够在gitproject/path/to/sharedcode并让我们的提交自动更新svnproject/trunk/path/to/sharedcode 这应该只影响这两个子目录,其余的 repos 应该保持独立。 我正在寻找从 git 到 Subversion 的单向永久链接。 历史需要保存在 git 中,但不需要保存在 svn 中,因为那里不会进行任何开发。 此外,我们希望这是可重复的,以便将来我们可以以相同的方式anothersvnproject/trunk/path/to/sharedcode为镜像。

可能的解决方案:

  • 检查gitproject/path/to/sharedcode更改的脚本(运行git diff ),如果找到,则复制它们并将它们推送到 svn repo。 这可以每天自动运行,也可以由进行一些更改的开发人员调用。
  • 像 ^this^ 这样的脚本,我们可以在进行提交时运行,而不是运行git push gitproject master将更改推送到 git 和 svn。

或者,如果所有其他方法都失败了,

  • 一个非常清晰、明显的工作流程,我们所有人在使用 git 时都可以轻松遵循。 类似于“首先,使用 COMMAND 签出 gitproject。然后使用 COMMAND 创建一个名为 NAME 的新分支。然后进行更改。然后转到 LOCATION 并运行 COMMAND...”

我试过的:

  • SubGit对我们的目的来说看起来有点矫枉过正,我不想/没有权限设置它,因为它不是开源的。 我也想在不创建新仓库的情况下做到这一点。

  • 使用git-svngitproject/path/to/sharedcodegit svn init --trunk=http://svnhost.com/svnproject/trunk/path/to/sharedcode --no-minimize-url创建一个新的存储库。 这会创建一个我可以从中推送的新本地存储库,可能对批处理脚本有用,但这不是理想的解决方案。

  • Git2Svn看起来很有前途,但我找不到任何文档,所以我不信任它。

  • 我以前使用过Svn2Git (用 Ruby 编写的那个)并且它工作得很好,但我认为它没有我现在需要的功能。

  • Git-Subversion Bridge看起来与我们想要的自动同步非常相似,但同样,它很复杂并且涉及设置一个全新的存储库。 如果我得到团队其他成员的帮助,我们可能最终会使用它。

  • 我还尝试编写我描述的 Windows 批处理脚本。 它是这样的: git pull最新版本的 gitproject,在gitproject/sharedcodesvnproject/sharedcode上运行一个git diff ,通过管道输出到一个 txt 文件,使用可怕的、可怕的 Windows IF语句来说明如果diff选择了除此之外的任何东西README, ROBOCOPY /MIR gitproject/sharedcode的内容到svnproject/sharedcodeROBOCOPY从备份到svnproject/sharedcode的正确 README , svn add所有内容,从远程 repo svn checkout ,最后svn commit 它没有用。

我确信我拥有解决方案的所有部分,但我缺乏将它们整合在一起的知识和编码技能。 我希望 stackoverflow 可以提供帮助。

  1. 你不能在 Git repo 中操作树的一部分(简而言之 - 它是一个整体对象,与 SVN 相反)
  2. 由于 p.1,您必须拆分 Git 存储库并将/path/to/sharedcode转换为其他特殊存储库。 您可以使用子模块方法(当今流行的 Git 男孩更喜欢子树)
  3. 使用专用存储库,您可以使用git-svn将新远程添加到svnproject/trunk/path/to/sharedcode (Git-history 将被镜像到 SVN,但这是最懒惰和最简单的方法)

我不同意Lazy Badger 的回答 尽管您无法查看git库的一部分。 您可以查看git repo 并在子树上使用文件系统操作。 因此,您可以有两个结帐:一个是svn库,另一个是git库。 然后您可以使用脚本(可能使用rsync )来同步适当的子目录。 没有理由检查差异。 版本控制将为您执行此操作。 然后您可以将更改提交到 svn 存储库。 此脚本可以作为cron作业运行。 只要您只需要同步单个分支,这就会起作用。

我现在找不到代码,但是我们有一个很大的git repo,另一个团队的svn repo 使用类似的方法维护子树的只读副本。

暂无
暂无

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

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