Git 吉特。更改存储库根文件夹

Git 吉特。更改存储库根文件夹,git,Git,我的项目在文件夹C:/projects/NameOfProject/MyCode/中,而.git位于文件夹MyCode/中,所以存储库中只有MyCode的内容 最近,我在文件夹OtherFiles/中添加了一些与文件夹NameOfProject/中的项目相关的其他文件。由于MyCode/中的文件与OtherFiles/中的文件之间的关系,我无法将这些文件移动到MyCode/。现在我需要以某种方式更改存储库设置,文件夹MyCode/和OtherFiles/将位于存储库的根目录下。而且,非常需要继续

我的项目在文件夹
C:/projects/NameOfProject/MyCode/
中,而
.git
位于文件夹
MyCode/
中,所以存储库中只有MyCode的内容

最近,我在文件夹
OtherFiles/
中添加了一些与文件夹
NameOfProject/
中的项目相关的其他文件。由于
MyCode/
中的文件与
OtherFiles/
中的文件之间的关系,我无法将这些文件移动到
MyCode/
。现在我需要以某种方式更改存储库设置,文件夹
MyCode/
OtherFiles/
将位于存储库的根目录下。而且,非常需要继续提交历史记录:更改存储库根之后的下一次提交将保留当前分支的历史记录

总结以上内容:我在
C:/projects/NameOfProject/MyCode/
中有repo,我想将repo根目录移动到
C:/projects/NameOfProject/
中,而不是移动这两个文件夹中的文件/子文件夹


如何实现这一点?

您可以在C:/projects/name of project/by下初始化新回购协议

git初始化


然后将远程分支拉到该repo下,只需将这两个文件夹MyCode和其他文件复制并替换到初始化的git repo中,然后将其推送到远程。

您需要使用
git filter branch
重写整个
NameOfProject/MyCode/
存储库中的目录名。我建议这样做:

  • 备份一切
  • 将目录
    MyCode
    复制到临时位置
  • (在该临时目录中)使用以下命令重写目录:
    git过滤器分支--树过滤器'mkdir MyCode&&mv*MyCode | |:'--所有
    。过滤器将重写所有分支;对于每个现有提交,它将创建一个新的子目录
    MyCode
    ,并将所有文件移动到其中(忽略错误;至少会有一个错误-无法将MyCode移动到
    MyCode
    )。这是整个过程的主要部分,;它使存储库准备使用子目录
    MyCode
    中的所有文件,而不是存储库的根目录,但保留提交历史记录
  • 将新的
    .git
    目录移动到
    C:/projects/NameOfProject/
    (不要移动到
    MyCode
    !)和cleanup temp dir
  • 验证是否有备份并删除
    MyCode/.git
  • git添加其他文件
  • git提交-m其他文件

  • 但是这会为MyCode保存他的提交历史吗?当然会。因为我们把远程分支拉到了这个回购协议上。那是行不通的。如果将
    C:/projects/NameOfProject/MyCode/
    拉入
    C:/projects/NameOfProject/
    git,它只会将文件从
    NameOfProject/MyCode/
    复制到
    NameOfProject/
    中,从而使整个
    NameOfProject/
    变得模糊。您需要重写整个
    NameOfProject/MyCode/
    存储库中的目录名。看起来是解决方案。我很快就会试试的。我现在还不知道这个过滤命令。谢谢分享。它确实值得知道,并将尝试此解决方案,然后返回。
    git filter branch
    很难使用,
    --tree filter
    相当慢(它为它处理的每个提交提取所有文件,然后从新树创建一个新的提交),但它是一个非常强大的命令。@phd它可以工作。在您的解决方案之后,我在
    refs/original/refs/remotes
    方面遇到了一些困难,但总的来说它是有效的。非常感谢。