【问题标题】:"git pull <remote> master" into a sub-directory“git pull <remote> master”进入子目录
【发布时间】:2018-05-09 18:36:54
【问题描述】:

背景

我正在尝试将包从 SVN 存储库移动到 GIT 存储库,同时保留它的历史记录。

步骤

  • 我使用git-svn 为SVN 生成了一个GIT 存储库。
  • 我正在按照提到的步骤 here 将代码从一个 GIT 存储库移动到另一个,同时保留历史记录。

我想将该包移动到目标 git 存储库中它自己的子目录中。但是,我被困在这一步:git pull &lt;remote&gt; master --allow-unrelated-histories

这会将代码拉入顶级 git 目录。如何将该代码拉入子目录?

我根据一些 SO 答案尝试了以下方法,但没有奏效:

  • git pull -work-tree &lt;working_dir&gt; -git-dir &lt;working_dir&gt; &lt;remote&gt; master
  • git pull -s subtree -Xsubtree=&lt;path_prefix&gt; &lt;remote&gt; master

清理步骤:

该包将保存在目标 GIT 存储库中,因此我打算:

  • 从 SVN 存储库中删除它。
  • 并且,还要删除中间 GIT 存储库,一旦包被移动就不需要它了。

【问题讨论】:

    标签: git git-svn svn2git


    【解决方案1】:

    如果您想将该 SVN 历史记录导入到它自己的子文件夹中,则需要将其导入到它自己单独的 git 存储库中。

    那你就可以了

    【讨论】:

    • 这是否允许我修改子目录,就好像它只属于现有的 Git 存储库一样?我已经编辑了这个问题,以清楚地说明我想要实现的目标。
    • @ShyamSunder 那将是一个子树。请参阅我编辑的答案及其参考。
    【解决方案2】:

    你引用的那个链接与SVN没有任何关系。

    无论如何,对于一次性迁移,git-svn不是转换存储库或部分存储库的正确工具。如果您想使用 Git 作为现有 SVN 服务器的前端,这是一个很棒的工具,但对于一次性转换,您应该使用git-svn,而是使用更适合的svn2git这个用例。

    有很多称为svn2git 的工具,可能最好的一个是来自https://github.com/svn-all-fast-export/svn2git 的KDE 工具。我强烈推荐使用svn2git 工具。它是我所知道的最好的,并且在你可以使用它的规则文件做什么方面非常灵活。

    您将能够轻松配置svn2gits 规则文件,以从当前的 SVN 布局中生成您想要的结果,包括可能存在的任何复杂历史,包括从一个 SVN 存储库中生成多个 Git 存储库或组合如果您愿意,可以在一次运行中将不同的 SVN 存储库干净地整合到一个 Git 存储库中。

    如果您不是 100% 了解存储库的历史记录,那么在将 SVN 存储库迁移到 Git 时,http://blog.hartwork.org/?p=763 中的 svneverever 是一个很好的工具来调查它的历史记录。


    尽管git-svn 更容易开始,这里还有一些其他原因说明为什么使用 KDE svn2git 而不是 git-svn 除了灵活性之外更胜一筹:

    • svn2git(如果使用正确的)重建历史记录会更好更干净,尤其是对于具有分支和合并等的更复杂的历史记录而言
    • 标签是真正的标签,而不是 Git 中的分支
    • git-svn 标签包含一个额外的空提交,这也使它们不属于分支,因此在您将--tags 提供给命令之前,普通的fetch 不会得到它们,因为默认情况下只有标签指向提取的分支也被提取。使用正确的 svn2git 标签是它们所属的地方
    • 如果您在 SVN 中更改了布局,您可以使用 svn2git 轻松配置它,使用 git-svn 您最终会丢失历史记录
    • 使用svn2git,您还可以轻松地将一个 SVN 存储库拆分为多个 Git 存储库
    • 或轻松将同一 SVN 根目录中的多个 SVN 存储库合并到一个 Git 存储库中
    • 正确的svn2git 的转换速度比git-svn 快无数倍

    您知道,git-svn 更差而 KDE svn2git 更优的原因有很多。 :-)

    【讨论】:

    • 对不起,你是对的。该链接与 git-svn 或 svn2git 无关。我只是简单介绍了为什么我对将文件从一个 Git 存储库移动到另一个保存历史感兴趣的背景。我现在已经编辑了问题以清楚地说明我想要实现的目标,但感谢您提供有关 svn2gitgit-svn 的详细说明。
    • 即使您更新了问题,答案也是一样的。使用正确的工具(KDE svn2git),您可以一步轻松地实现您想要的,产生更好更快的结果。
    • 谢谢。同意 git-svn 不保留完整的历史记录,但我主要关心的是从不同的 git repo 将代码签出到子目录中。 git-subtree 适用于该用例。
    猜你喜欢
    • 1970-01-01
    • 2022-08-17
    • 2011-02-22
    • 2013-11-06
    • 2018-10-18
    • 2020-07-27
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多