如何使用git-filter-repo将一个仓库合并为另一个仓库的子目录

12

在尝试使用git filter-branch来合并存储库时,使用此gist。 只需添加相关的代码片段:

git filter-branch -f --prune-empty --tree-filter '
        mkdir -p "${REPO_NAME}_tmp"
        git ls-tree --name-only $GIT_COMMIT | xargs -I{} mv {} "${REPO_NAME}_tmp"
        mv "${REPO_NAME}_tmp" "$REPO_NAME"
    '

我收到了来自 Git 的警告,内容如下:

WARNING: git-filter-branch has a glut of gotchas generating mangled history
     rewrites.  Hit Ctrl-C before proceeding to abort, then use an
     alternative filtering tool such as 'git filter-repo'
     (https://github.com/newren/git-filter-repo/) instead.  See the
     filter-branch manual page for more details; to squelch this warning,
     set FILTER_BRANCH_SQUELCH_WARNING=1.

因此,我查看了 git filter-repo,其说明如下:

重新组织文件布局(例如将所有文件移动到子目录中,以准备与另一个存储库合并,...)

这表明可以使用 git filter-repo 解决此问题,但即使在查看文档和给出的示例之后,我仍然找不到实现这一点的方法。请问有人能够帮我吗?

2个回答

8

请在脚本中替换filter-branch命令。

git filter-branch -f --prune-empty --tree-filter '
        mkdir -p "${REPO_NAME}_tmp"
        git ls-tree --name-only $GIT_COMMIT | xargs -I{} mv {} "${REPO_NAME}_tmp"
        mv "${REPO_NAME}_tmp" "$REPO_NAME"
    '

使用此功能

git filter-repo --to-subdirectory-filter "$REPO_NAME"

请查看此处路径快捷方式部分

--to-subdirectory-filter <directory>

把项目根目录当做在<directory>

相当于使用--path-rename :<directory>/


1
这似乎是一次路径重命名,作为基于路径的过滤器的一部分:
cd  $REPO_DIR_TMP
git filter-repo  --path-rename /:${REPO_NAME}_tmp/

这将重写第二个存储库子文件夹内的历史记录(在该第二个存储库中)。

然后,您可以将其添加为第一个存储库的远程,像您的gitst一样进行获取和合并。


这里返回:错误:使用--path-rename时,如果OLD_NAME和NEW_NAME都是非空的,并且其中任一个以斜杠结尾,则两者都必须这样。 - Saurabh P Bhandari
在文件夹后面添加一个斜杠。 - VonC

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