使用 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
根据您的结构,可能有更优雅的方法来实现您正在寻找的东西,但结合上述方法应该可以解决您的用例。
不要忘记处理和推送您可能拥有的任何标签。
我正在尝试将包含客户端和服务器的存储库拆分为两个存储库,我想将各自的文件夹移动到根目录,同时保留根目录中已有的文件 - 项目自述文件,.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
根据您的结构,可能有更优雅的方法来实现您正在寻找的东西,但结合上述方法应该可以解决您的用例。
不要忘记处理和推送您可能拥有的任何标签。