gpt4 book ai didi

git - 从 git repo 中提取子目录到另一个 repo 并保持目录结构?

转载 作者:太空狗 更新时间:2023-10-29 14:33:30 26 4
gpt4 key购买 nike

我的存储库中有几个子树(例如 ./sub1/, ./sub2/, ..)我想将它们提取到单独的存储库中,保持提交历史和相同的目录结构,即 sub1 的新 repo 应该有来自主 repo 的 ./sub1/ 子树。我该怎么做?

最佳答案

您可以将 git 的 filter-branch 与子树过滤器一起使用。

步骤如下:

  1. 克隆一个工作副本。这个操作会改变本地仓库,所以我们必须先有一个工作副本。您可以按如下所示执行 git 克隆,也可以只复制它。

    git clone --no-hardlinks <original repository> <working copy>
  2. 使用子树过滤器。

    cd <working copy>

    git filter-branch --subdirectory-filter <subdir path to be splited> --prune-empty --tag-name-filter cat -- --all

    # reset current working directory
    git reset --hard
  3. 我们已经完成了我们的任务,最好做一些清理工作,因为很多旧对象变得无法访问了。

    1. 删除旧的 Remote

      git remote rm origin
    2. 删除旧的 reflog

      # clean unneeded reflog in order to free space
      refbak=$(git for-each-ref --format="%(refname)" refs/original/)
      if [ -n "$refbak" ];then
      echo -n $refbak | xargs -n 1 git update-ref -d
      fi
      git reflog expire --expire=now --all
    3. 重新打包并压缩repo

      # prune loose objects
      git gc --aggressive --prune=now

这将使 repo 结构从

repo/
|-- sub1/
|-- sub11
|-- sub12
|-- sub2

repo/
|-- sub11
|-- sub12

但是,你好像想让它变成

repo/
|-- sub1/
|-- sub11
|-- sub12

然后,还需要做一步,用index-filter重写git提交历史。

# replace <subdir path> with the actual subdir path, for this case, it should be "sub1"
git filter-branch --index-filter 'git ls-files -s | sed "s-\t-&<subdir path>/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD

关于git - 从 git repo 中提取子目录到另一个 repo 并保持目录结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12801763/

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