将许多子目录拆分到一个新的、单独的 Git 存储库中
Splitting many subdirectories into a new, separate Git repository
这个问题是关于:
- detach-many-subdirectories-into-a-new-separate-git-repository
- Git subtree and multiple directories
我不想分离一个子目录,而是要分离几个。例如,这是我的文件夹结构:
/app1
/file1
/file2
/folder1
/folder2
/app2
/file3
/file4
/folder3
/folder4
/test
/file5
/file6
/folder5
/folder6
/README.md
/new_file
我想要这个:
/app1
/file1
/file2
/folder1
/folder2
/app2
/file3
/file4
/folder3
/folder4
我尝试了以下替代方法,none 目前有效:
git filter-branch --index-filter 'git rm --cached -qr -- . && git reset -q $GIT_COMMIT -- /app1/* app2/*' --prune-empty -- --all
Error:
pathspec '.' did not match any files
第二次尝试:
git filter-branch --tree-filter "mkdir samples; mv app1 app2 samples/" HEAD
Error:
rename app1 to samples/app1: No such file or directory
Same error for the second sub-directory
有什么想法吗?
在使用 tree-filter 的情况下,您将评估每个提交的脚本,即使是 app1 和 app2 可能不存在的提交,这可以通过一个守卫和一个不会失败的替代命令来解决。
git filter-branch --tree-filter "mkdir samples && test -d app1 && mv app1 samples/|| test -d app2 && mv app2 samples/ || echo 'nothing to do'" HEAD
然后将示例设为根目录,这会将 app1 和 app2 移动到项目的根目录。
git filter-branch -f --subdirectory-filter samples -- --all
建议您先备份!
# safety play: do this in a scratch clone
git clone --mirror . ../redo
cd !$
# build the exact index you want:
git filter-branch --index-filter '
git read-tree --empty
git read-tree --prefix=app1/ $GIT_COMMIT:app1
git read-tree --prefix=app2/ $GIT_COMMIT:app2
' -- --all
...可能 --tag-name-filter cat
将旧标签指向新的(重写的)提交 w/o 更改名称。
这个问题是关于:
- detach-many-subdirectories-into-a-new-separate-git-repository
- Git subtree and multiple directories
我不想分离一个子目录,而是要分离几个。例如,这是我的文件夹结构:
/app1
/file1
/file2
/folder1
/folder2
/app2
/file3
/file4
/folder3
/folder4
/test
/file5
/file6
/folder5
/folder6
/README.md
/new_file
我想要这个:
/app1
/file1
/file2
/folder1
/folder2
/app2
/file3
/file4
/folder3
/folder4
我尝试了以下替代方法,none 目前有效:
git filter-branch --index-filter 'git rm --cached -qr -- . && git reset -q $GIT_COMMIT -- /app1/* app2/*' --prune-empty -- --all
Error:
pathspec '.' did not match any files
第二次尝试:
git filter-branch --tree-filter "mkdir samples; mv app1 app2 samples/" HEAD
Error:
rename app1 to samples/app1: No such file or directory
Same error for the second sub-directory
有什么想法吗?
在使用 tree-filter 的情况下,您将评估每个提交的脚本,即使是 app1 和 app2 可能不存在的提交,这可以通过一个守卫和一个不会失败的替代命令来解决。
git filter-branch --tree-filter "mkdir samples && test -d app1 && mv app1 samples/|| test -d app2 && mv app2 samples/ || echo 'nothing to do'" HEAD
然后将示例设为根目录,这会将 app1 和 app2 移动到项目的根目录。
git filter-branch -f --subdirectory-filter samples -- --all
建议您先备份!
# safety play: do this in a scratch clone
git clone --mirror . ../redo
cd !$
# build the exact index you want:
git filter-branch --index-filter '
git read-tree --empty
git read-tree --prefix=app1/ $GIT_COMMIT:app1
git read-tree --prefix=app2/ $GIT_COMMIT:app2
' -- --all
...可能 --tag-name-filter cat
将旧标签指向新的(重写的)提交 w/o 更改名称。