【问题标题】:How to move a repo to a parent folder with adding parent's files to the repo & preserve history如何通过将父文件添加到存储库并保留历史记录将存储库移动到父文件夹
【发布时间】:2020-01-12 10:10:32
【问题描述】:

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

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

我该怎么做?

注意:我试过this answer,但无法将文件添加到整个回购历史。 然后我尝试了rebase -i --root (here),但这仅适用于一个分支,损坏并过时了其余分支。

【问题讨论】:

    标签: git branch git-branch


    【解决方案1】:

    开始之前:备份您的 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 中,您必须稍微调整树过滤器命令。

    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
    

    【讨论】:

    • 谢谢,我试过这个命令,它不包含其他文件到历史记录中:bar/和hello.txt
    • @HamzaHajeir 好吧,当然,因为根据您问题中的描述,仅跟踪 src/ 目录中的文件。因此,使用我回答中的命令,您可以操纵树,使所有内容都出现在 src/ 子目录中,然后您可以添加未跟踪的 bar/hello.txt
    • @HamzaHajeir 我更新的答案是否适合您的需求?
    • 嗨@Henri,感谢您的回答.. 首先它并不适用于所有分支,所以我在 HEAD 之前添加了 --all 并且效果很好。请编辑答案以匹配此。
    • 读者需要考虑的一些事情:我在bar 中有另一个repos,无法复制它们。 (通过将 git 链接添加到项目依赖项来修复:私有案例).. 第二件事:我的历史中有一个 tag。我错过了添加--tag-name-filter cat,所以它没有被重写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多