繁体   English   中英

将 git repo 转换为子模块

[英]Convert git repo to submodule

所以我对整个git主题git陌生。 但是我想做的是在多台机器上同步我的点dotfiles 我知道那里有很多教程,我掌握了基本概念。 但我的问题是更具体的一个勾号。

第一件事:我正在使用 Windows(目前)和Vim 最重要的是,我使用vundle来管理我的插件。 现在插件本身就是git-repos 目录~/.vim (这是我要同步的主要存储库)包含它们。

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

我现在得到的是~/.vim/bundle/...中的一堆绿色文件夹,它们代表其他存储库。 git status命令将它们报告为未跟踪的内容(不,它不是我的.gitignore做了一些时髦的事情)。

如果您不熟悉绿色文件夹“现象”,您可能想看看我的 repo。

PS 其中一个子文件夹说的是已修改的内容而不是未跟踪的内容,即使我没有触摸它。 我不知道为什么。

如果您的所有包都只是没有修改的基本克隆,您可以执行以下操作:从 dotfiles 存储库的根目录:

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 的引用。

每次您看到未经任何显式修改的修改内容时,请检查全局设置( core.autocrlfcore.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 别名:

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM