将git repo转换为子模块

时间:2013-04-25 20:59:33

标签: git git-submodules

所以我对整个git主题相当陌生。但我要做的是将我的dotfiles同步到多台机器上。我知道有很多教程,我有基本的概念。但我的问题更具体。

首先要做的事情是:我正在使用Windows(现在)和Vim。最重要的是,我使用vundle来管理我的插件。现在插件本身就是git-repos。目录~/.vim(我想要同步的主要仓库)包含它们。

所以我的问题是,如何初始化现有仓库的submodule

我现在得到的是~/.vim/bundle/...中的一堆绿色文件夹,代表另一个回购。 git status命令将它们报告为未跟踪的内容(并且不是我的.gitignore做了一些时髦的东西。)

如果您不熟悉绿色文件夹“phenomenon”,您可能需要查看我的回购。

P.S。其中一个子文件夹显示修改内容而不是未跟踪内容,即使我没有触摸它。我不明白为什么。

3 个答案:

答案 0 :(得分:3)

如果您的所有捆绑包都只是没有修改的基本克隆,您可以执行以下操作:从dotfiles repo的根目录开始:

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

这应该足够好 - 如果任何捆绑包不是存储库,或者如果你手动添加它,那么它只会传递该目录。

然后,您可以执行git submodule foreach git pull更新所有内容,并添加它们以更新您的dotfiles repo的引用。

答案 1 :(得分:1)

每当您看到修改过的内容而没有任何明确的修改时,请检查可以在结帐时进行更改的全局设置(core.autocrlf, core.filemode)。)

对于.vim/bundle/中的每个目录,您需要:

  • 转到该模块:cd .vim/bundle/aModule
  • 初始化git repo(git init。),提交并推送到GitHub上的新git仓库
  • 回到父代仓库:cd ..(你在.vim/bundle/
  • git submodule add https:///github.com/tairun/aModule aModule(请注意,此子模块可以track the latest of a branch, if you want to

然后git submodule update --init --remote

答案 2 :(得分: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>