将所有具有完整历史记录的git内容在文件夹层次结构中上移一级

将所有具有完整历史记录的git内容在文件夹层次结构中上移一级,git,Git,我的git回购目前看起来如下所示: .git\ A_Dir\ +---- B_Dir\ +---- C_Dir\ +---- ManyFiles 我想像这样将A_Dir的所有内容上移一级(并删除A_Dir)[包括整个历史、引用、标记-就好像A_Dir的内容一直在.git的相同Dir级别上,这样我就能够合并所有分支-因为移动从未发生过]: .git\ B_Dir\ C_Dir\ ManyFiles 我已经在stackoverflow上找到了一些答案,比如: git filter-branch

我的git回购目前看起来如下所示:

.git\
A_Dir\
+---- B_Dir\
+---- C_Dir\
+---- ManyFiles
我想像这样将
A_Dir
的所有内容上移一级(并删除
A_Dir
)[包括整个历史、引用、标记-就好像
A_Dir
的内容一直在
.git
的相同Dir级别上,这样我就能够合并所有分支-因为移动从未发生过]:

.git\
B_Dir\
C_Dir\
ManyFiles
我已经在stackoverflow上找到了一些答案,比如:

git filter-branch --index-filter 'git ls-files -s |
    sed "s-\t\"*-&new_subdir/-" |
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' --tag-name-filter cat -- --all
这会重写整个历史记录,但会将
new_subdir
目录中的内容上移。我需要一个反方向的命令


有人能帮忙吗?

git filter branch
通过其
--子目录filter
选项明确支持您所需的内容:

git filter-branch --subdirectory-filter A_Dir --tag-name-filter cat -- --all

A_Dir
之外内容的任何历史记录都将丢失。这还将重写任何标记,以指向修改后的提交,这要归功于
--tag name filter
选项。

这正是我所需要的!很有魅力,非常感谢!