首页 > 解决方案 > 如何通过将父文件添加到存储库并保留历史记录将存储库移动到父文件夹

问题描述

我有一个多分支存储库foo/src,但是我想在保留历史记录并将所有这些文件添加到整个历史记录的同时向上移动存储库(.git 成为 src 的邻居)。

--- foo/  
      |-bar/  
      |-src/
           |-.git
      |-hello.txt

我怎样才能做到这一点 ?

注意:我已经尝试过这个答案,但无法将文件添加到整个回购历史记录中。然后我尝试了rebase -i --roothere),但这仅适用于一个分支,损坏并过时了其余的分支。

标签: gitbranchgit-branch

解决方案


开始之前:备份您的 git 存储库,因为该filter-branch命令具有破坏性!


您可以使用git filter-branch--tree-filter选项。选项手册--tree-filter指出:

这是用于重写树及其内容的过滤器。该参数在 shell 中进行评估,工作目录设置为签出树的根目录。然后按原样使用新树(自动添加新文件,自动删除消失的文件 - .gitignore 文件和任何其他忽略规则都没有任何效果!)。

因此,对于每个提交,我们都希望创建一个新目录src并将树中的所有文件移动到它(src/当然不包括它自己)。

git filter-branch --tree-filter '
mkdir -p src
for i in *; do
    if [ "$i" != "src" ]; then
        mv "$i" src/
    fi
done
' --all

之后,您可以添加未跟踪的bar/目录并hello.txt在顶部添加新的提交。

如果您希望bar/并且hello.txt从历史记录开始就出现在 repo 中,则必须稍微调整 tree filter 命令。

git filter-branch --tree-filter '
mkdir -p src
for i in *; do
    if [ "$i" != "src" ]; then
        mv "$i" src/
    fi
done
cp -R "/path/to/bar" .
cp "/path/to/hello.txt" .
' --all

推荐阅读