将git子模块合并到主仓库

tf7tbtn2  于 2022-12-21  发布在  Git
关注(0)|答案(2)|浏览(210)

好的,我们有一个包含3个子模块的仓库。现在我们想把这些子模块合并回主仓库,保留所有的历史记录(好吧,使用子模块比有用更令人头痛)。我们该怎么做呢?

yyyllmsg

yyyllmsg1#

假设您有以下文件系统(为了简化答案,假设您只有一个子模块)

myRepoRoot
├── myMainFiles/
└── submodule/

您只需执行以下操作:

# Preparing the filesystems
cd submodule
# "submodule" is basically the path where you need your submodule code to be in the new repository,
# e.g. app/code/x/y (<-- in this case you need to create multiple folders ofc, not just one like seen here)
mkdir submodule
git mv file1 file2 dir1 dir2 submodule 
git commit -am "Moved file"

# Actually merging
cd myRepoRoot
git remote add sub url_to_submodule
git fetch sub
git merge sub/master

用文字来解释:你有几棵树没有共同的提交,你只需要合并这些树,这就是第二部分要做的.
第一部分只是为了确保子模块的文件系统是您所期望的。

tcomlyy6

tcomlyy62#

我根据@gturri的答案添加了一个示例,希望对大家有所帮助:

示例

假设这是你的子模块:

app/
├─ code/
│  ├─ Foo/
│  │  ├─ Bar/
│  │  │  ├─ .git/
│  │  │  ├─ .gitignore
│  │  │  ├─ registration.php
│  │  │  ├─ etc/
│  │  │  │  └─ modules.xml
│  │  │  ├─ view/
│  │  │  │  ├─ frontend/
│  │  │  │  │  ├─ templates/
│  │  │  │  │  │  ├─ foo.phtml

您的子模块存储在app/code/Foo/Bar中,您需要它位于新存储库中的确切位置,然后执行以下操作:

# CD into the submodule
cd app/code/Foo/Bar

# Create the same directory tree as the current submodule path, in your submodule
mkdir -p app/code/Foo/Bar
    • 专业提示**:使用git submodule foreach 'mkdir -p "$sm_path"'在所有子模块中自动创建目录结构。

参见文档
添加的新目录:

app/
├─ code/
│  ├─ Foo/
│  │  ├─ Bar/
│  │  │  ├─ .git/
│  │  │  ├─ .gitignore
│  │  │  ├─ registration.php
│  │  │  ├─ etc/
│  │  │  │  └─ modules.xml
│  │  │  ├─ view/
│  │  │  │  ├─ frontend/
│  │  │  │  │  ├─ templates/
│  │  │  │  │  │  ├─ foo.phtml
│  │  │  ├─ app/
│  │  │  │  ├─ code/
│  │  │  │  │  ├─ Foo/
│  │  │  │  │  │  ├─ Bar/

通过GIT将文件移动到新文件夹:

git checkout <target_branch>
git pull
git mv .gitignore registration.php etc/ view/ app/code/Foo/Bar
git commit -am "Moved files"
git push

现在它看起来像这样:

app/
├─ code/
│  ├─ Foo/
│  │  ├─ Bar/
│  │  │  ├─ .git/
│  │  │  ├─ app/
│  │  │  │  ├─ code/
│  │  │  │  │  ├─ Foo/
│  │  │  │  │  │  ├─ Bar/
│  │  │  │  │  │  │  ├─ .gitignore
│  │  │  │  │  │  │  ├─ registration.php
│  │  │  │  │  │  │  ├─ etc/
│  │  │  │  │  │  │  │  └─ modules.xml
│  │  │  │  │  │  │  ├─ view/
│  │  │  │  │  │  │  │  ├─ frontend/
│  │  │  │  │  │  │  │  │  ├─ templates/
│  │  │  │  │  │  │  │  │  │  ├─ foo.phtml

删除子模块文件夹:

rm -rf <my_repo_root>/app/code/Foo/Bar

将子模块合并到存储库中:

cd myRepoRoot
git remote add sub <url_to_submodule>
git fetch sub
git merge sub/master

您的子模块现在应该位于存储库中的app/code/Foo/Bar

相关问题