【问题标题】:git - Move Subdirectories into Branchesgit - 将子目录移动到分支中
【发布时间】:2015-05-15 17:53:24
【问题描述】:

我有一个 git repo,它的根目录中有几个子目录,例如

repo<master>/a/files
repo<master>/b/files
...

我想将每个子目录从主分支移到它自己的分支中,并在此过程中将文件上移一个目录,这样我就剩下这样的东西了。

repo<branch_a>/files
repo<branch_b>/files
...

我有一些想法,例如:

  1. 从 master 中删除所有项目,创建一个新分支,复制该分支所需的文件,提交。这样做的问题是我会丢失文件的提交历史记录。
  2. 分支、删除我不需要的目录、将文件上移一级、提交。这将保留历史记录,但我将在每个分支中进行大量相同的删除。

有没有我可以更有效地做到这一点,即减少删除但仍保持修订历史?

这个问题类似于Detach (move) subdirectory into separate Git repository,但我不想将每个子目录移动到单独的存储库中,而是将其移动到自己的分支中。

【问题讨论】:

    标签: git version-control reorganize


    【解决方案1】:

    这是一个适度简洁的方法:

    • 删除master 上的所有子目录,每个子目录都在一个单独的提交中
    • 根据master创建您想要的每个分支
    • 在每个分支上,还原删除该分支所需目录的提交
    • 将目录上移一级

    伪bash:

    $ for dir in one two three; do git rm -r $dir; git commit -m "Remove $dir"; done
    $ git log # For commit SHAs
    $ git checkout -b one
    $ git revert $sha_that_removed_one
    $ git mv one/* .
    $ git commit -m "Move one files to the top level"
    

    【讨论】:

    • 这听起来像是一个可行的解决方案。我将如何使用 git 执行“在每个分支上,还原删除分支所需目录的提交”?我不明白你的意思是“你也可以先做所有的动作,如果你不介意你的分支在删除之前有多余的动作。”
    • 更新了一个害羞的例子——这更有帮助吗?通过更多的努力,您可以自动执行每个目录的分支/恢复/移动逻辑。不用管先移动的部分,因为看起来你只有一层目录,所有的文件都会混在一起。
    • 这很完美。聪明 :) 花了我一些时间的一件事, git revert 使用默认提交消息。我的 git 维护者要求提交消息具有特定格式,并且有一个挂钩可以防止推送格式不正确的消息。因此,在我认为我已经完成了所有工作之后,我不得不手动重新设置/重新编写几个提交。可以使用 git revert 的 --edit 标志编辑提交消息。谢谢!
    • 不错的提示,--edit 听起来也是添加上下文的好方法。谢谢!
    【解决方案2】:

    这似乎是一个使用git submodules的好地方

    【讨论】:

    • 我阅读了您提供的链接中的前几段。我看不出这是如何相关的,git 子模块本质上是嵌套的 git 存储库。这不是我想要的,也不符合我的需求。
    猜你喜欢
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2022-01-22
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多