所以我对整个git
主题相当陌生。但我要做的是将我的dotfiles
同步到多台机器上。我知道有很多教程,我有基本的概念。但我的问题更具体。
首先要做的事情是:我正在使用Windows(现在)和Vim
。最重要的是,我使用vundle
来管理我的插件。现在插件本身就是git-repos
。目录~/.vim
(我想要同步的主要仓库)包含它们。
所以我的问题是,如何初始化现有仓库的submodule
?
我现在得到的是~/.vim/bundle/...
中的一堆绿色文件夹,代表另一个回购。 git status
命令将它们报告为未跟踪的内容(并且不是我的.gitignore
做了一些时髦的东西。)
如果您不熟悉绿色文件夹“phenomenon”,您可能需要查看我的回购。
P.S。其中一个子文件夹显示修改内容而不是未跟踪内容,即使我没有触摸它。我不明白为什么。
答案 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
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>
。