我们只在 CI 上看到一个奇怪的错误。我们有一个 git 存储库(我们称之为“OUTER”),其中包含一个子模块(“INNER”)。如果我们在开发机器上正常克隆“OUTER”并更新子模块,我们不会发现任何问题。在 CI 上,Bitrise 以奇怪的方式“克隆”存储库后,git fetch在尝试获取子模块时调用会抛出错误。
这是一个示例输出。请注意,前几行模拟 Bitrise 如何“克隆”存储库。
\n\xe2\x9e\x9c test git "init"\ngit "remote" "add" "origin" "git@github.com:COMPANY/OUTER.git"\ngit "fetch" "--jobs=10" "--no-tags" "origin" "refs/heads/master"\ngit "checkout" "master"\ngit "merge" "origin/master"\ngit "submodule" "update" "--init" "--recursive" "--jobs=10"\n\nhint: Using \'master\' as the name for the initial branch. This default branch name\nhint: is subject to change. To configure the initial branch name to use in all\nhint: of your new repositories, which will suppress this warning, call:\nhint: \nhint: git config --global init.defaultBranch …Run Code Online (Sandbox Code Playgroud) 我的组织(或我的用户)内有两个私有 GitHub 存储库。其中一个包含另一个作为子模块。如何克隆另一个私有存储库及其包含的子模块?
我试过
- uses: actions/checkout@v3
with:
submodules: true
Run Code Online (Sandbox Code Playgroud)
但是,这失败了,子模块部分出现错误消息,我是否应该添加一些权限或其他权限?
Fetching submodules
/usr/bin/git submodule sync
/usr/bin/git -c protocol.version=2 submodule update --init --force --depth=1
Submodule '.github/workflows/MYPROJECT1' (https://github.com/MYUSER/MYPROJECT1.git) registered for path '.github/workflows/MYPROJECT1'
Cloning into '/home/runner/work/MYPROJECT2/MYPROJECT2/.github/workflows/MYPROJECT1'...
remote: Repository not found.
Error: fatal: repository 'https://github.com/MYUSER/MYPROJECT1.git/' not found
Error: fatal: clone of 'https://github.com/MYUSER/MYPROJECT1.git' into submodule path '/home/runner/work/MYPROJECT2/MYPROJECT2/.github/workflows/MYPROJECT1' failed
Failed to clone '.github/workflows/MYPROJECT1'. Retry scheduled
... more errors
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试将我们的版本控制切换到Git(来自CVSNT).令人惊讶的是,这不是我遇到问题的分期性或临时区域的概念.但是,我很难解决AFAICT操作(如分支,合并和标记)始终应用于存储库级别而不是文件或目录级别的问题.
我们在不同的项目中重用了很多代码.我的工作区目前看起来像这样:
/Dev
/Libs
/LibA
/LibB
/LibC
/Project1
/Project2
/Project3
/WebDev
Run Code Online (Sandbox Code Playgroud)
现在,假设Project1依赖于LibA和LibB,Project2依赖于LibB和LibC,而Project3没有lib依赖.其中一些lib后来被编译成DLL(或BPL-我们的主要开发环境是Delphi),其他只是可重用代码的集合,它们逐个文件地包含在主项目中.
WebDev包含我们(主要是静态的)公司网站的代码,该网站还包含有关Project1,2,3的信息,因此可能必须与它们一起标记.
由于我在项目之间切换很多,我通常会同时检查所有这些,在必要时将lib目录即时更新到相应的项目分支.
我将如何在Git中对此进行建模,是否有理由坚持这种工作方式?我已经阅读了关于git子模块但是到目前为止我没有看到我将如何应用这里有几个原因:
据我所知,子模块总是会在各自的"超级项目"中检出.但是,我们发现使用Delphi管理(设计时)库代码的多个副本是皇家PITA,这是我们将所有库保存在单个项目树之外的公共目录下的原因之一.其他副本只能通过构建自动化进行检查,从不进行任何实际工作.
我真的不希望libs与项目"独立":如果我标记或分支其中一个项目,我总是想标记或分支各自的库.当我想回到主项目的特定标记版本时,我希望libs也可以恢复到该状态.如果可能,标记/分支/签出应始终在项目及其依赖项的单个步骤中发生.
我已经尝试将所有内容放在一个Git存储库中,其中库代码主要在主分支上进行管理,并且每个"项目"都在自己的分支上,但每当我尝试合并主服务器和项目分支之间的lib更改时,它就会拉动来自不相关的libs的所有文件,这根本不是我想要的......
你们有什么想法如何最好地解决这一切?我对所有的建议都持开放态度,包括我工作树的新布局.
如果有人能指出我关于子模块的实际动手教程(或者我需要完成的任何其他技术),那也很棒.
git version-control git-submodules version-control-migration
在工作中,我们正在处理十几个Java OSGi包,每个包都有自己的git存储库.从长远来看,所有捆绑包都是相互独立的,这证明了各个存储库的合理性 - 尽管现在我们仍然经常同时修改其中的几个.
当我们进行产品发布(由所有包组成)时,会在每个包中创建一个新分支,这有点痛苦.因此我们考虑使用git-submodule来缓解疼痛(类似的事情git submodule foreach <cmd>).
因此,我们所需的设置将是一个主项目Product,以及每个包的子模块:
Project/
BundleA/
BundleB/
BundleC/
Run Code Online (Sandbox Code Playgroud)
现在,我花了几个小时阅读所有关于子模块的内容,我明白如果我修改内容BundleA,我必须提交BundleA,推送,然后提交子模块更改Project并再次推送.
这听起来好像不是git-submodule设计为首先使用的方式.这样使用它是违反最佳做法的吗?或者听起来像一个替代选择的情况?
任何其他建议欢迎.
我有一个带子模块的存储库.对我来说,这个子模块是只读的,所以我使用submodule.Module.ignore = dirty.
这适用于'git status',但是当我提交时,整个子模块被扫描,并且在git的注释中我可以看到它很脏.
有办法避免这种情况吗?
我有一个提交master,hash 6877146,它更新了一个子模块.
$ git show 6877146
commit 6877146f1781bfbd4ec3ae2a27121a606f5f688e
Author: [snip]
Date: Wed Feb 22 16:10:20 2012 +0000
updating potatobase
diff --git a/potatobase b/potatobase
index 5877e2c..b77ba62 160000
--- a/potatobase
+++ b/potatobase
@@ -1 +1 @@
-Subproject commit 5877e2c2d82645fa44f121884291ee48cf24584d
+Subproject commit b77ba624d6a1c5e62d434ad2d06383604aeab431
Run Code Online (Sandbox Code Playgroud)
这个提交在master分支上,我目前已检查过:
$ git branch -a --contains 6877146
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/ticket-1479-refactor-blade-json-functions
Run Code Online (Sandbox Code Playgroud)
但是,在子模块上执行git log并不会显示提交:
$ git log potatobase | grep 6877146
$
Run Code Online (Sandbox Code Playgroud)
如果我明确地检查了这个提交,它就在日志中:
$ git checkout 6877146
$ git log potatobase | grep 6877146
commit 6877146f1781bfbd4ec3ae2a27121a606f5f688e
Run Code Online (Sandbox Code Playgroud)
当我检查出master时,为什么这个提交没有显示在日志中?它已经合并为主人:
$ …Run Code Online (Sandbox Code Playgroud) 我在github上使用git进行源代码控制和托管.我们正努力让回购尽可能小.
我决定为项目添加提升,(相对于我们的要求)非常大.我已经提取了所需功能的子集.现在我对如何在git上处理这个问题感到困惑.我应该将我的boost子集添加到存储库吗?如果我将boost作为子模块添加,下载大小将会有点大(我假设,我没有测试过这个).
这通常是怎么做的?
最近Git的更改改变了.git使用子模块时目录的处理方式..git现在,所有内容都位于"根级别" .git目录(与包含子模块的工作副本相对应的目录)中,而不是每个子模块有一个.
然后,在每个子模块中,创建一个指向.git目录新位置的文件.
在我的项目中,我有以下.gitmodules文件:
[submodule "tests/shared-tests"]
path = tests/shared-tests
url = git://github.com/roboptim/roboptim-shared-tests.git
[submodule "cmake"]
path = cmake
url = git://github.com/jrl-umi3218/jrl-cmakemodules.git
Run Code Online (Sandbox Code Playgroud)
当我这样做时git clone --recursive,我获得:
$ cat cmake/.git
gitdir: /home/moulard/profiles/default-x86_64-linux-ubuntu-12.04.1/src/unstable/roboptim/roboptim-core/.git/modules/cmake
Run Code Online (Sandbox Code Playgroud)
我目前正在使用Git 1.8.1.5.
我的问题是:
请注意,这是不一样的前一个问题移动包含子模块一个Git仓库的父目录在这个意义上,我肯定这不是一个绝对路径在我的存在相关的问题.gitmodules的文件.
我注意到在我的目录中有两个模块是我的Git存储库的Subprojects.发生这种情况是因为我将它们全部移动到一个Git仓库并且这些模块(目录)有自己的.git目录.
当我在这些模块中更改任何内容时,我不会在主Git存储库中看到任何更改.我只会看到这个:
+Subproject commit e97ff0348e6adc697192ca4e6a367bdaeddcda6b-dirty
Run Code Online (Sandbox Code Playgroud)
等等
但我不需要那个.我只需要一个没有任何子项目的Git存储库.所以我删除了.git这些子项目中的目录.现在我在主存储库中看不到任何变化.
我试着add *和git init.但它只是看不到那些目录,即使它在存储库中.我怎样才能让Git看到那些目录,所以它会像其他模块一样跟踪它们的变化?
我的Git存储库看起来像这样:
my_project/
.git
dir1
dir2
dir3 # Let's say this is the one directory that Git does not see. So any changes I make here are not tracked at all.
...
...
Run Code Online (Sandbox Code Playgroud)
PS那些未跟踪的目录不为空.
更新
如果我重命名该目录,那么执行以下操作:
git diff
我明白了:
diff --git a/dir3 b/dir3
deleted file mode 160000
index e279fc4..0000000
--- a/dir3
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit e279fc481b9706ad79b24281efdbabd55179aee8
Run Code Online (Sandbox Code Playgroud)
如果我将该目录重命名为原始名称,那么执行git diff …
Sourcetree默认情况下会提取子模块,这是CLI不做的事情(由dafault提供).如何阻止sourcetree拉动子模块?