假设我们在github上有以下存储库结构:
company:project.git
\- company:submodule.git
Run Code Online (Sandbox Code Playgroud)
我公司的开发人员分配公司项目,使他的工作区看起来像这样:
developer:project.git
\- company:submodule.git
Run Code Online (Sandbox Code Playgroud)
对于90%的开发人员来说这很好,因为他们不更改子模块库,他们只在项目中工作.现在假设有一个新功能需要改进子模块.负责此操作的开发人员将他的工作空间转换为:
developer:project.git
\- developer:submodule.git
Run Code Online (Sandbox Code Playgroud)
到达那里并不简单,因为他需要用另一个子模块替换子模块(对于git,子模块的原始和分支是两个不同的东西).
如果这个开发人员在库上工作了一段时间,他会将这个结构提交给他的主分支,所以他在github上的fork总是使用forked子模块.
一旦他准备好开发,他就会创建一个拉取请求.问题是,合并拉取请求时,主存储库将如下所示:
company:project.git
\- developer:submodule.git
Run Code Online (Sandbox Code Playgroud)
这是有问题的,因为现在每个跟踪公司分支的开发人员都会得到开发人员的子模块.
要解决这个问题,在开发人员提出拉取请求之前,应该将他的主分支移回公司:submodule.git - 这非常尴尬,特别是因为在本地他总是仍然想要使用developer:submodule.饭桶.
我们已经尝试了几个工作流程,而上述问题是我们唯一没有良好工作流程的问题.
我有一个包含许多子模块的项目.我想用以下命令遍历每个子模块:
git submodule foreach npm install
我希望脚本继续循环遍历每个子模块,即使一个子模块返回错误(非零返回码).目前,在任何子模块中运行此命令的非零返回码将导致git停止在其余子模块上循环.
关于如何实现这一目标的任何建议?
问题:
有没有办法通过与主存储库相同的方法(ssh或https)自动检出git子模块?
背景:
我们有一个非公开的gitlab存储库(main),它有一个子模块(utils),它也作为非公共gitlab存储库托管在同一台服务器上.可以通过ssh或https访问这些存储库:
user@gitlabserver.com:my/path/repo.githttps://gitlabserver.com/my/path/repo.git两种变体显然都需要不同形式的认证,并且取决于客户端计算机和用户,优选一种或另一种.
对于main不是问题的顶级存储库(),任何人都可以选择他或她喜欢的方法,但对于子模块,这取决于.gitmodules文件,因此(最初)对所有人都是相同的.
现在,而不是每个人都必须将.gitmodules文件调整为他们喜欢的任何内容,并确保他们不会意外地提交这些更改,如果有一种方法只需指定服务器和repo路径并且git选择其中一个,那就太好了.用于主repo的方法,或者可以在gitconfig中设置的方法.
我想将https://github.com/getyouridx/pychargify克隆到我的django项目中,并且需要不时地提取更新.
只是为了澄清,我可以简单地从django项目的根目录中编写一个gitignore,.gitignore: pychargify/.git或者还有其他我应该注意的缺陷吗?
我正在尝试更新这个git repositary的子模块但是我一直遇到致命的错误:
[root@iptlock ProdigyView]# git submodule update --recursive
Cloning into core...
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
Clone of 'git@github.com:ProdigyView/ProdigyView-Core.git' into submodule path 'core' failed
Run Code Online (Sandbox Code Playgroud)
或者这样
[root@iptlock root]# git clone --recursive https://github.com/ProdigyView/ProdigyView.git
Cloning into ProdigyView...
remote: Counting objects: 438, done.
remote: Compressing objects: 100% (275/275), done.
remote: Total 438 (delta 172), reused 394 (delta 128)
Receiving objects: 100% (438/438), 8.03 MiB | 5.19 MiB/s, done.
Resolving deltas: 100% (172/172), done.
Submodule 'core' (git@github.com:ProdigyView/ProdigyView-Core.git) registered for path …Run Code Online (Sandbox Code Playgroud) 跑步有什么区别
git submodule update --remote
Run Code Online (Sandbox Code Playgroud)
VS
cd <submodule directoy>
git pull
Run Code Online (Sandbox Code Playgroud)
假设子模块先前已设置为跟踪某个分支:
git submodule add -b master [URL to Git repo]
Run Code Online (Sandbox Code Playgroud) 我正在尝试向我的git repo添加一个子模块,我收到了这个错误:
remote origin does not have a url defined in .git/config
Run Code Online (Sandbox Code Playgroud)
关于这可能是什么的任何想法?我试着谷歌搜索它,但只有一个模糊的链接出现.
我这样做:
git submodule add ../extern/Lib1 lib
Run Code Online (Sandbox Code Playgroud)
我期待这个创建一个子模块lib/Lib1
我知道这只会创建一个引用,然后我必须更新/ init(在这部分不是很清楚,没有那么远;我只是在学习子模块命令).
使用git子模块时遇到问题.
每当我从上游存储库收到一个新的子模块引用时,执行git submodule update会给出以下结果:
fatal: reference is not a tree: dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
Unable to checkout 'dd208d46ecdd1ac0d2b2594a610fe4c9150fece1' in submodule path 'submodule/path'
Run Code Online (Sandbox Code Playgroud)
重要的是要注意子模块有几个遥控器,其中上游遥控器应该用于更新子模块参考树.我猜我的问题在那里,但我不确定.
我的设置如下:
Git项目
遥控器:
origin (我的git fork)upstream (项目回购)子模块"模块",有遥控器:
origin (我的git fork)upstream (项目回购)有谁知道是什么导致了我的问题?
有人请帮我理解git中的子模块.我知道他们在互联网上受到了很多抨击但是因为我认为git开发人员是聪明人,所以当前行为必须有理由 - 也许是一种解决我的问题的方法.
所以,我有一个项目和一些子模块.该项目有不同的分支,如:
我的子模块经常不会更新(可能每周一次)所以我很好,他们没有自动附加到子模块库的头部.
但是,当我查看旧分支时 - 因为我需要修复旧版软件中的错误 - 我还需要更新子模块.
为什么我需要这样做?
我希望git像svn一样工作.当我在我的主回购中投入工作时,我希望git能够按照以下思路思考:"好吧,他现在想要完成他的工作.我可以看到子模块目前处于修订版abc所以当他在将来的某个时候回到这个提交,他可能想要再次使用相同版本的子模块."
我不能看到一个案例,当你在主存储库中返回3年时,你希望子模块保持当前版本.但是,这个实施必须有理由,对吧?
我真的很想知道你是否有人知道这背后的想法,但无论如何我真的想要一个解决方案.有没有办法告诉git:"我想用这些子模块提交这项工作.如果我在某个时候回到这种状态,我希望子模块也能在正确的版本中检出."
澄清的例子
我的主存储库是一个需要使用SSL的应用程序,我找到了一个我作为子模块添加的SSL库(libSSL).
2010年10月31日,我在我的主存储库(2fd4e1)中创建了一个提交,而子模块指向了libSSL版本3(c67a2d).
时间过去了,libSSl更新到版本34,我调整我的代码,生活很好.
在2013年5月14日,我创建了一个新的提交(28fced)和子模块指向最新版本的libSSL(849ee1).
但是,如果我查看2fd4e1,即使原始提交是使用c67a2d创建的,我的子模块也将保持在849ee1.Git知道我使用c67a2d进行了原始提交,但我没有看到你怎么可能想要另一个子模块而不是创建原始提交的子模块.
该git文档不让它完全清楚的区别是什么之间git submodule update和git submodule sync为.我也没有在网上找到任何帮助.有人可以帮助我解决这里的不同之处吗?
update
Update the registered submodules to match what the superproject expects
by cloning missing submodules and updating the working tree of the
submodules. The "updating" can be done in several ways depending on
command line options and the value of submodule.<name>.update
configuration variable.
Run Code Online (Sandbox Code Playgroud)
-
sync
Synchronizes submodules' remote URL configuration setting to the value
specified in .gitmodules. It will only affect those submodules which
already have a URL entry …Run Code Online (Sandbox Code Playgroud)