使用 git filter-repo 将子目录移动到根目录,同时将文件保留在根目录中

Use git filter-repo to move a subdirectory to root while retaining files in root

我正在尝试将包含客户端和服务器的存储库拆分为两个存储库,我想将各自的文件夹移动到根目录,同时保留根目录中已有的文件 - 项目自述文件,.gitlab-ci.yml.gitignore, .gitattributes` 等等。

我尝试了以下行但没有成功:

git filter-repo --path .gitattributes --path .gitignore [...] --subdirectory-filter server

结果我还是不太明白; subdir 过滤器似乎起作用了,但是充满更改的整个提交最终都丢失了。以上显然不是正确的方法,假设有一个正确的方法。

我通过使用 --path-rename-match 的单独调用来破解它,首先将根文件移动到 server 子目录,以便通过最终调用将它们移回根目录--subdirectory-filter server,但这似乎根本不对。

如果我没理解错的话,你的项目结构类似于下面的内容。

client/
server/
.gitlab-ci.yml
.gitignore

如果您想将客户端和服务器目录分别提取到一个专用项目,但将文件保留在每个目录的根目录中,您可以使用 --invert-paths 选项。

使用原始的全新克隆,删除服务器目录,将源设置为新的客户端项目并推送到主分支。

git filter-repo --path server --invert-paths

获取原始的新克隆,删除客户端目录,并推送到新的服务器项目。

git filter-repo --path client --invert-paths

如果要更新路径,请使用--path-rename。这可用于重命名子目录或在层次结构中向上移动子目录。例如,如果您想删除封闭的 server 目录并将内容移动到项目的根目录。

git filter-repo --path-rename server/foo:foo

根据您的结构,可能有更优雅的方法来实现您正在寻找的东西,但结合上述方法应该可以解决您的用例。

不要忘记处理和推送您可能拥有的任何标签。