将git仓库转换为子模块

5
我对git这个主题还比较陌生。但是我想要做的是在多台机器之间同步我的dotfiles文件。我知道有很多教程,也掌握了基本概念。但我的问题更加具体。
首先:我现在使用Windows和Vim。此外,我使用vundle来管理我的插件。现在,这些插件本身就是git-repos。目录~/.vim(我想要同步的主要repo)包含它们。
所以,我的问题是如何初始化现有repo的submodule
现在,我的~/.vim/bundle/...中有一堆绿色的文件夹,代表其他repos。git status命令将它们报告为“未跟踪的内容”(不是我的.gitignore出了点问题)。
如果您不熟悉绿色文件夹 "phenomenon",您可能想看一下我的存储库。
附注:其中一个子文件夹显示为“修改的内容”而不是“未跟踪的内容”,尽管我没有更改它。我不知道为什么。
3个回答

5
如果你的所有捆绑包都只是基本克隆而没有修改,你可以像这样操作:从你的点文件库的根目录开始:
for d in `find .vim/bundle/ -maxdepth 1 -mindepth 1 -type d`
do
    pushd $d
    export url=$(git config --get remote.origin.url)
    popd
    git submodule add $url $d
done

这应该足够好用了——如果任何一个 bundle 不是仓库,或者您已经手动添加了它,那么它将只是跳过该目录。

然后,您可以执行 git submodule foreach git pull 来更新它们,并将它们添加到更新您的 dotfiles 仓库的引用中。


1
这正是我所需要的。谢谢。顺便说一下,我还添加了一些检查,以确保子模块是 git 存储库,然后再尝试添加它。这样我就可以在一个文件夹中使用它,其中一些子文件夹是存储库,而另一些则不是。 - mattgately

1
每当您看到没有显式修改的修改内容时,请检查全局设置(core.autocrlf, core.filemode),这可能会在检出时进行更改。
对于.vim/bundle/中的每个目录,您需要:
  • 进入该模块:cd .vim/bundle/aModule
  • 初始化git仓库(git init .),将其提交并推送到GitHub上的新git仓库
  • 返回到父仓库:cd .. (您在.vim/bundle/中)
  • git submodule add https:///github.com/tairun/aModule aModule (请注意,如果需要,此子模块可以跟踪分支的最新版本)
然后执行git submodule update --init --remote

谢谢你的回答。需要一些时间来测试所有内容。到目前为止,即使我没有完全按照你告诉我的那样做,一切都运行得非常好。我仍然不熟悉很多像 git submodule update --init --remote 这样的链接命令,所以我只能猜测它们的作用。也许我以后会回来分享我的步骤。但基本上我所做的是(从我的 repo 顶部开始)git submodule add git@github.com:user/repo.git bundle/aBundle。当我遇到 index 错误时,我运行了 git rm --cache bundle/aBundle。从那里开始,我会执行 git submodule update --init - Sensei
@Sensei:你可能应该将其作为单独的答案发布。问题可能并不完全清楚,你的vundle插件是从Web克隆的git仓库,并且你正在尝试用基本子模块替换它们。 - naught101

0

因为这项工作对我来说似乎很重复,所以我想分享以下相当长的git别名:

git config --global alias.convertGitRepoToSubmodule '!f() { if [ "$#" = 0 ]; then echo "Usage: convertGitRepoToSubmodule <submodule_directory...>" >&2; return 1; fi; cd -- "${GIT_PREFIX:-.}"; for i; do origin="$(cd "$i" && git config --get remote.origin.url)"; ( set -x; git submodule add "$origin" "$i"; ); done; }; f'

然后只需执行:

git convertgitrepotosubmodule $(find .vim/bundle/ -maxdepth 1 -mindepth 1 -type d)

并且它应该在所有目录上调用 git submodule add <the origin> <the dir>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接