gpt4 book ai didi

git - 只有一个子目录的Svn到Git

转载 作者:太空狗 更新时间:2023-10-29 13:10:13 34 4
gpt4 key购买 nike

我了解 git-svn 并使用它来将 SVN 存储库迁移到 Git。

对于一个 repo 协议(protocol),我有一个特定的要求,但我找不到解决方案。该 SVN 存储库包含多个实际项目作为子目录:

trunk/
project1/
project2/
project3/
branches/
branch1/
project1/
project3/
project2/
...

等等……

我想做的是将这些“子项目”中的每一个导入到 git 中它自己的存储库中——显然,保留修订历史记录、分支、提交消息、标签等。

我可以使用 --ignore-paths--include-paths 开关一次只 pull 其中一个子项目,但它们仍然会出现在相应的 project1 等子目录下。我真正想要结束的是 project 的内容在每个分支(包括主干)的根目录中。

有办法吗?

最佳答案

我找到了解决方案。它不像git svn clone那么简单,但并不太难。所以,这就是我所做的(例如,在问题的场景中为 project1):

  1. 在 git 服务器上为 project1 创建一个空的 repo
  2. 将空的 repo 克隆到我的本地机器上:
    git clone git@git.server.com:group/project1.git
  3. 进入那个空的 repo 工作目录:
    cd project1
  4. 初始化 git svn 仓库:
    git svn init --stdlayout --no-metadata https://svn.server.com/group
  5. 现在,神奇的地方来了。如果此时我运行 git config --local --list ,我得到以下信息(仅显示相关行):

    svn-remote.svn.fetch=trunk:refs/remotes/trunk
    svn-remote.svn.branches=branches/*:refs/remotes/branches/*
    svn-remote.svn.tags=tags/*:refs/remotes/tags/*

    我现在需要做的就是git config --local --edit并添加 project1在正确的地方:

    svn-remote.svn.fetch=trunk/project1:refs/remotes/trunk
    svn-remote.svn.branches=branches/*/project1:refs/remotes/branches/*
    svn-remote.svn.tags=tags/*/project1:refs/remotes/tags/*
  6. 现在您可以 git svn fetch

  7. 设置分支和标签:

    for branch in `git branch -r | grep "branches/" | sed 's/ branches\///'`; do
    git branch $branch refs/remotes/branches/$branch
    done

    for tag in `git branch -r | grep "tags/" | sed 's/ tags\///'`; do
    git tag -a -m"Converting SVN tags" $tag refs/remotes/tags/$tag
    done
  8. 最后将其全部推送到远程:

    git push --all origin
    git push --tags origin

现在,如果您克隆您的存储库,您将获得 project1 的内容在您克隆的存储库的根目录中 - 正是我要找的。

关于git - 只有一个子目录的Svn到Git,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34609767/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com