使用git filter-repo将子目录拆分为自己的代码仓库

4

我正在遵循这个链接的步骤:https://docs.github.com/cn/get-started/using-git/splitting-a-subfolder-out-into-a-new-repository

我有一个名为my-repo的仓库。

它下面的目录结构如下:

MyProject
   |
   ------ UI
   |
   ------ DB
   |
   ------ SERVER
   |
   ------ ANDROID

我希望将上述ANDROID目录分离出来,创建一个名为my-repo-android的新仓库。
我已经采取了以下措施:
  1. Cloned the repository

    git clone git@bitbucket.org:myproject/my-repo.git
    
  2. Go into that directory:

    cd my-repo
    
  3. Remove origin to avoid any push by mistake

    git remote rm origin
    
  4. Run filter repo command

    git filter-repo --path MyProject/ANDROID --path-rename ANDROID/:
    
命令成功执行了。但是,我没有像ANDROID那样获得根目录,相反地,我仍然看到目录为MyProject/ANDROID,其中的其他所有内容都被删除。
我哪里做错了?
如何正确使用filter-repopath-rename选项,以使项目结构从MyProject\ANDROID更改为直接位于根目录下的ANDROID目录?
编辑:
根据下面的评论和答案,以下命令可行:
git filter-repo --path MyProject/ANDROID/ --path-rename MyProject/ANDROID/:ANDROID/

在此之后,我远程创建了一个新的代码库并运行了以下命令:
  1. Add remote origin

    git remote add origin git@bitbucket.org:mypronect/androidRepo.git
    
  2. Master branch

    git branch -M master
    
  3. Pull first

    git pull origin master --allow-unrelated-histories
    
  4. Push

    git push -u origin master
    

现在我可以在Bitbucket上的新的androidRepo正确地看到ANDROID目录。

当我打开任何文件时,我也可以看到历史记录。因此,filter-repo已按预期工作。

但是,我只看到master分支。我没有看到其他历史分支和标签。(我们为每次发布标记/创建一个单独的分支)。

我错过了什么?如何保留与ANDROID相关的所有分支和标签?

我尝试了以下命令,但它没有生效:

 git push --all origin

你的实际命令中的 --path-rename 是针对 ANDROID/ 还是 MyProject/ANDROID/ 目录的? - LeGEC
@LeGEC: 抱歉,我是新手。您的意思是什么?在生成的代码库中,我希望将“ANDROID”作为我的根目录,而不是“MyProject/ANDROID”。 - Vicky
1
你可以尝试使用 --path-rename MyProject/ANDROID:ANDROID 吗? - LeGEC
@LeGEC:那个方法有效。你能否请检查我上面更新的问题?这是我面临的最后一个问题。我想保留分支历史和标签历史。但是,通过我所做的,我只看到主分支在远程。 - Vicky
没问题。找到答案了。我之前错误地使用了 --all 标志。 - Vicky
2个回答

4
--path-rename选项中,你忘记了在ANDROID之前加上MyProject。通过使用--path MyProject/ANDROID,你告诉filter-repo只保留MyProject/ANDROID文件夹路径。而--path-rename ANDROID/:则是将ANDROID文件夹转换为根文件夹。

我猜测你的filter-repo找不到MyProject内部的ANDROID文件夹,因此无法重命名它。

最终命令可能是:
git filter-repo --path MyProject/ANDROID/ --path-rename MyProject/ANDROID/:

或者,相应的快捷方式:
git filter-repo --subdirectory-filter=MyProject/ANDROID

编辑:我以为您想将ANDROID文件夹的内容作为根目录,但看起来您想将ANDROID文件夹从./MyProject移动到./。在这种情况下,用--path-rename MyProject/ANDROID:ANDROID参数的 @LeGEC 将获得分数。


谢谢你的回答。那个方法有效。请查看我的更新问题。我已经更新了这个问题,这样每个人都可以在这里找到完整的流程参考。谢谢。 - Vicky
没问题。找到答案了。我之前错误地使用了 --all 标志。 - Vicky
非常感谢。这正是我正在寻找的! - helhum

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接