5

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

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

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

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

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

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

4

3 回答 3

4

如果你所有的包都只是基本的克隆,没有修改,你可以这样做:从你的 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 的引用。

于 2015-11-26T03:00:36.827 回答
1

每次您看到未经任何显式修改的修改内容时,请检查全局设置 ( core.autocrlf,core.filemode ),它可以在结帐时进行更改。)

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

  • 转到该模块:cd .vim/bundle/aModule
  • 初始化 git repo (git init .),提交并推送到 GitHub 上的新 git repo
  • 回到父仓库:(cd ..你在.vim/bundle/
  • git submodule add https:///github.com/tairun/aModule aModule(请注意,如果您愿意,此子模块可以跟踪最新的分支

然后git submodule update --init --remote

于 2013-04-26T11:51:35.520 回答
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>所有目录。

于 2021-03-20T12:36:14.503 回答