对Git子模块进行非子模块化,将所有代码带回核心存储库的最佳实践是什么?


当前回答

以下是我发现的最好最简单的方法。

在子模块repo中,你想从HEAD合并到main repo:

git checkout -b "mergeMe" mkdir "foo/bar/myLib/"(与你想要在主repo上的文件的路径相同) git mv * "foo/bar/myLib/"(移动所有到路径) Git commit -m“准备合并到main”

在删除子模块并清除路径"foo/bar/myLib"后,回到主repo:

SubmoduleOriginRemote/mergeMe

繁荣做

记录保存

不用担心


注意,这与其他一些答案几乎相同。但这假设你拥有子模块repo。此外,这也使子模块的未来上游更改变得容易。

其他回答

Git rm——缓存了the_submodule_path 从.gitmodules文件中删除子模块部分,或者如果它是唯一的子模块,则删除该文件。 执行一个提交"removed submodule xyz" Git添加了_submodule_path 另一次提交“添加xyz的代码库”

我还没找到更简单的方法。你可以通过git commit -a把3-5压缩到一个步骤中——这取决于你的喜好。

以下是我发现的最好最简单的方法。

在子模块repo中,你想从HEAD合并到main repo:

git checkout -b "mergeMe" mkdir "foo/bar/myLib/"(与你想要在主repo上的文件的路径相同) git mv * "foo/bar/myLib/"(移动所有到路径) Git commit -m“准备合并到main”

在删除子模块并清除路径"foo/bar/myLib"后,回到主repo:

SubmoduleOriginRemote/mergeMe

繁荣做

记录保存

不用担心


注意,这与其他一些答案几乎相同。但这假设你拥有子模块repo。此外,这也使子模块的未来上游更改变得容易。

基于VonC的回答,我创建了一个简单的bash脚本。最后的add必须使用通配符,否则它将撤销子模块本身先前的rm。重要的是要添加子模块目录的内容,而不是在add命令中命名目录本身。

在一个名为git- integration -submodule的文件中:

#!/usr/bin/env bash
mv "$1" "${1}_"
git submodule deinit "$1"
git rm "$1"
mv "${1}_" "$1"
git add "$1/**"

下面是@gyim的回答的一个稍微改进的版本(IMHO)。他在主工作副本中做了很多危险的改变,我认为在独立的克隆上操作,然后在最后将它们合并在一起要容易得多。

在一个单独的目录中(使错误更容易清理并再次尝试)检出顶部回购和子回购。

git clone ../main_repo main.tmp
git clone ../main_repo/sub_repo sub.tmp

首先编辑subrepo以将所有文件移动到所需的子目录中

cd sub.tmp
mkdir sub_repo_path
git mv `ls | grep -v sub_repo_path` sub_repo_path/
git commit -m "Moved entire subrepo into sub_repo_path"

注意头部

SUBREPO_HEAD=`git reflog | awk '{ print $1; exit; }'`

现在从主回购中删除子回购

cd ../main.tmp
rmdir sub_repo_path
vi .gitmodules  # remove config for submodule
git add -A
git commit -m "Removed submodule sub_repo_path in preparation for merge"

最后,合并它们

git fetch ../sub.tmp
# remove --allow-unrelated-histories if using git older than 2.9.0
git merge --allow-unrelated-histories $SUBREPO_HEAD

并完成了!安全而且没有任何魔法。

git rm [-r] --cached submodule_path

返回

fatal: pathspec 'emr/normalizers/' did not match any files

背景:我在子模块文件夹中执行了rm -r .git*,然后才意识到它们需要在我刚刚添加它们的主项目中去子模块化。我得到了上面的错误去子模化一些,但不是所有的。不管怎样,我通过运行(当然,在rm -r .git*之后)来修复它们。

mv submodule_path submodule_path.temp
git add -A .
git commit -m "De-submodulization phase 1/2"
mv submodule_path.temp submodule_path
git add -A .
git commit -m "De-submodulization phase 2/2"

注意,这并不能保存历史。