我真的很喜欢这个命令来获取子模块的repo:
git clone git@github.com:my_user/my_repo.git --recursive
Run Code Online (Sandbox Code Playgroud)
但是,子模块到达时都设置为"无分支",我必须手动检查每个子模块.有没有办法递归拉取子模块并自动将分支设置为主?
假设我有四个名为Core,A,B,Super的项目.依赖树是这样的:
Super ---> Core
|-> A -> Core
|-> B -> Core
Run Code Online (Sandbox Code Playgroud)
我希望每个项目都是独立的,也就是说,我希望能够自己签出并编译每个项目(当然每个项目都依赖于它们).
我考虑过将每个项目映射到一个存储库,然后将依赖项与子模块一起引用,但是我看到了这种方法的以下问题:
那么......我错过了什么吗?我是否误解了git子模块或误用了它们?有没有其他解决方案来解决这个问题(除了诉诸二进制依赖)?
我有一个git存储库设置了几个子模块,它创建一个.gitmodules文件,它是父存储库中的跟踪文件.但是,还有其他开发人员想要在此存储库上工作,并检查子模块.但是目前远程子模块存储库的URL包含我的用户名; 在.gitmodules文件中它是这样的:
[submodule foo]
path = sub/foo
url = https://myuser@example.com/git/foo.git
Run Code Online (Sandbox Code Playgroud)
显然,其他开发人员无法从获取example.com的myuser(他们没有我的密码); 我怎样才能拥有一个多个开发人员可以拉/推的主存储库,并允许他们单独访问子模块(设置他们在子模块主机服务器上共享的单个用户名可以工作,但不是很好的用户管理) ?
如何将来自另一个git存储库的单个文件链接到您自己的存储库?我不想要完整的存储库,只需要一个文件.使用git submodule似乎是正确的路线,但它想抓住整个事情.
要填充存储库的子模块,通常会调用:
git submodule init
git submodule update
Run Code Online (Sandbox Code Playgroud)
在这种用法中,git submodule init似乎只做一件事:填充.git/config已经存在的信息.gitmodules.
那是什么意思?
不能git submodule update简单地使用来自的信息.gitmodules?这样可以避免:
git submodule init); 和.gitmodules内容到.git/config).或者:
git submodule init我不知道(在这种情况下,请赐教!); 要不然git submodule init 可以在Git中弃用而没有任何伤害.以下哪一项是正确的?
有没有办法,实际上没有检查父提交,根据父克隆中的提交ID确定子模块的SHA-1提交ID?我知道我可以通过'git submodule'找到当前关联的SHA-1.
这是一个例子:我有一个带有单个子模块'foo'的克隆,它在上个月已经改变了好几次.我在父克隆中有一个标签,这个标签是几个星期,叫做'release-1.2.3'.我想知道'foo'的关联SHA-1对于这个标记的提交是什么.我可以简单地检查'release-1.2.3'并使用git-submodule来查看,但我想知道是否有办法在不影响工作树的情况下执行此操作,因为我想编写脚本.
我想这样做是因为我想构建一个脚本来对父存储库中两个提交之间的子模块中的所有更改执行'diff' - 即"告诉我在这两个提交之间的子模块'foo'中更改了哪些文件'父母."
我无法更新git子模块,错误如下:
$ git submodule init
Submodule 'build/html' (git@github.com:quadroid/clonejs.git) registered for path 'build/html'
...
$ git submodule update
Cloning into 'build/html'...
Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.
Run Code Online (Sandbox Code Playgroud)
但是当我在本地执行相同的任务时,一切都很好.
我如何解决这个问题,以便Travis CI构建通过,我仍然可以单击repo中的子模块来指向它?
在我的项目中,我需要使用第三方代码,存储在几个Git存储库中.我的项目也存储在(单独的)Git存储库中.在主项目中有几个人和我一起工作,我是维护者.
在早期的项目中,我曾经手动将依赖项复制到Git工作树,添加一个指定我使用的版本的小文件.
现在这是相当不舒服的,因为我需要每天更新一个依赖项,并且经常自己贡献代码,大部分时间都伴随着对主项目的更改.
我决定尝试使用Git子模块进行管理.我尝试的越多,我就越沮丧.甚至看起来手动副本也许更好.
以下是我的一些担忧:
git checkout现在需要git submodule update --init).git archive最值得注意的是).git submodule无法使用--git-dir和--work-tree选项,并且需要将当前目录的物理更改为"工作树的顶层".似乎为了简化我们的子模块工作流程(即一个操作==一个命令),我们必须在Git周围编写一个相当厚的包装器.这真是难过;这真是伤心.
请注意,不能选择远离Git或将子项目开发完全合并到主项目中.
也许我用git submodules的是错误的方式?有没有关于工作流程的好教程?
即使您不知道正确的答案,请大家说出来,但请分享我的疑虑.:-)
我在我的主git文件夹树中添加了一个子模块,并且没有更改任何内容,但它显示已修改.我该怎么办?
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: example.com/soundmanager
#
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)
我尝试过git子模块更新,但它没有做任何事情.
我在使用包含多个子模块的git存储库时遇到了一些麻烦.
使用命令构建了超级git存储库
mkdir projectname
cd projectname
git init
git submodule add ssh://myusername@server/pathtorepos
Run Code Online (Sandbox Code Playgroud)
当一个不同的用户("otheruser")然后克隆超级存储库时,一切似乎都有效.但是,是时候访问子模块了
git submodule init
git submodule update
Run Code Online (Sandbox Code Playgroud)
git尝试使用"myusername"而不是"otheruser"克隆子模块.
如何解决这个问题呢?
git ×10
git-submodules ×10
diff ×1
github ×1
rationale ×1
repository ×1
ssh ×1
travis-ci ×1
workflow ×1