【问题标题】:detaching a subdirectory of a repo and making it a branch of another repo?分离回购的子目录并使其成为另一个回购的分支?
【发布时间】:2012-03-19 09:17:09
【问题描述】:

我有一个 git repo,比如说 repoA,有很多子目录。如何分离其中一个子目录,比如 dir1,并将其作为单独的分支(带有历史记录)添加到另一个 repo?

其次,如何从 repoA 中删除分离子目录的历史记录?

【问题讨论】:

  • 有一个名为git-subtree 的工具可以从你的repo 中分离出一个子目录。我不知道它是否可以从您的主仓库中删除该子目录的历史记录。如果没有,您可以随时使用git filter-branch 执行此操作,尽管该命令有点复杂。
  • 谢谢凯文!我已经分离了子目录: git filter-branch --subdirectory-filter dir1 --prune-empty 这让我只剩下 dir1,现在我必须将此目录添加到另一个 repo,比如 RepoB,作为单独的分支。对我来说棘手的部分是我怎样才能使 dir1 的历史成为 repoB 历史的一部分,所以每当用户执行 repoB 的 git 克隆时,他也可以看到 dir1 的整个历史。在寻找解决方案时,我开始了解“graft”文件和 git-rebase。但是,正如我所提到的,我是 git 新手,我不知道如何使用这些选项。
  • 所以你有一个只包含dir1历史的repo。最简单的做法是使用git fetch 将此历史记录获取到您要添加到的存储库中,然后只需git merge 将其放入。

标签: git git-filter-branch


【解决方案1】:

问题的第一部分:

如何分离其中一个子目录,比如 dir1,并将其作为单独的分支(带有历史记录)添加到另一个 repo?

git checkout -b tempBranch
git filter-branch --subdirectory-filter dir1 --prune-empty 

在第二个存储库中:

git remote add filtered_dir1 ../original_repo
git fetch filtered_dir1
git merge filtered_dir1/tempBranch

问题的第二部分:

其次,如何从 repoA 中删除分离子目录的历史记录?

$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch dir1" --prune-empty

这可能会失败,并显示无法进行备份的警告;我不确定这是怎么回事,但添加-f 将强制git-filter-branch 无论如何运行。

这将在当前分支中运行。如果您想在所有分支上运行它,请附加-- --all。注意-- --all

一些注意事项:

  1. 运行git filter-branch 时,您将过滤您所在的分支。 (很明显,如果您考虑一下)。如果您尝试提取一些历史记录以推送到第二个存储库,您可能希望在 新分支git filter-branch,以便原始存储库不会丢失任何内容。

  2. This question 中有一些有用的信息。

  3. git filter-branch --subdirectory-filter 将使subdirectory 成为分支的新根目录——它将文件从subdirectory 移动到/。为了解决这个问题,EXAMPLES 部分底部有一个来自man git-filter-branch 的示例:

    要将整棵树移动到子目录中,或从那里删除:

       git filter-branch --index-filter \
               'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
                       GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                               git update-index --index-info &&
                mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
    

【讨论】:

    猜你喜欢
    • 2015-01-06
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 2020-10-17
    • 2018-02-11
    • 2021-11-30
    相关资源
    最近更新 更多