Git:将回购创建为子模块

Git:将回购创建为子模块,git,git-submodules,Git,Git Submodules,我想创建一个新的存储库作为项目的子模块 通常,我创建一个Github repo,然后使用命令将其添加为子模块 git子模块将url\u添加到\u repo.git 有没有一种方法可以直接创建一个新的回购协议作为子模块,而无需先在其他地方创建回购协议(既不是本地的也不是远程的,例如在Github上)?我不明白你怎么能做到:根据定义,子模块是另一个回购协议的SHA1(即父回购协议必须存在另一个回购协议才能提取所述SHA1):您必须在父回购中保留的中引用其地址 子模块由主存储库中的所谓提交对象组成,该

我想创建一个新的存储库作为项目的子模块

通常,我创建一个Github repo,然后使用命令将其添加为子模块
git子模块将url\u添加到\u repo.git


有没有一种方法可以直接创建一个新的回购协议作为子模块,而无需先在其他地方创建回购协议(既不是本地的也不是远程的,例如在Github上)?

我不明白你怎么能做到:根据定义,子模块是另一个回购协议的SHA1(即父回购协议必须存在另一个回购协议才能提取所述SHA1):您必须在父回购中保留的中引用其地址

子模块由主存储库中的所谓提交对象组成,该提交对象引用内部存储库中完全独立的特定提交对象

submodule..url
定义可从中克隆子模块存储库的URL。这可能是一个准备传递给git clone(1)的绝对URL,或者(如果它以
/
./
开头)一个相对于超级项目的原始存储库的位置


因此,您可以在本地创建子模块repo,但无论如何都必须创建它。

如果我理解正确,这就是我经常为eclipse项目和工作区所做的。让我们从这个结构开始:

$ find .
.
./projekt.txt
./sub1
./sub1/sub1.txt
./sub2
./sub2/sub2.txt
首先初始化子模块和主模块:

$ cd sub1
$ git init
$ git add *
$ git commit -m "init sub1"
$ cd ../sub2
$ git init
$ git add *
$ git commit -m "init sub2"
$ cd ..
$ git init
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   projekt.txt
#   sub1/
#   sub2/
现在应该是这样

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   .gitmodules
#   new file:   sub1
#   new file:   sub2
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   projekt.txt
$git状态
#论分行行长
#
#初始提交
#
#要提交的更改:
#(使用“git rm--cached…”取消存储)
#
#新文件:.gitmodules
#新文件:sub1
#新文件:sub2
#
#未跟踪的文件:
#(使用“git add…”包含在将提交的内容中)
#
#projekt.txt
最后,在父文件夹上执行一个
git add*
git commit-m“init parent”
,您就到了


如果您现在更改其中一个子模块中的文件,则必须先提交子模块,然后提交父存储库,以便在有人克隆您的父repo时获得子模块的最新版本。

简单!Say
submodule\u dir
是您希望子模块化的目录的名称(假设它还未处于git控制之下)

以后(一旦你高兴了)


如何
git init。;mkdira;裁谈会a;git初始化。;光盘git子模块add./a a
还是一个坏主意?@manuels这是我刚才在回答中添加的内容,但问题是:您必须创建一个回购协议,以便能够在父回购协议中将其作为子模块引用。但是,我看不出,一旦您的父repo被另一个用户推送到GitHub并克隆,它将如何运行。因此,如果我在超级repo的目录中创建repo,并将此目录用作子模块,也可以吗?@manuels是:您可以声明一个子模块,它是主repo的嵌套repo。问题是:任何克隆您的主repo(您本可以推送到GitHub)的人都无法访问您的嵌套repo(即使也推送到GitHub),因为
/myNestedRepo
url将引用其本地工作站上的空目录。如果您懒得登录GitHub(或脱机),则会播放该命令我想现在就创建子模块,以后再推。当我想添加一个新文件夹作为新的子模块时,这对我来说非常有用。如果有人像我一样犯了错误,在git submodule add中输入了错误的子模块路径,那么可以通过命令
git mv error\u path correct\u path
进行修复,git将自动修复子模块管道,并移动子模块。(此mv a子模块需要>git版本1.8.5)
$ git submodule add ./sub1
$ git submodule add ./sub2
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   .gitmodules
#   new file:   sub1
#   new file:   sub2
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   projekt.txt
cd submodule_dir
git init
git add .
git commit
# on github, create the new repo, then:
git remote add origin git@github.com:your_username/your_repo_name.git
git push -u origin master
cd ..
mv submodule_dir submodule_dir_delete_me
git submodule add git@github.com:your_username/your_repo_name.git submodule_dir
rm -rf submodule_dir_delete_me