假设我在 github 上找到一个我想要使用的有趣的存储库,我将其添加为子模块,然后有一天存储库的所有者决定删除该存储库,我的子模块会损坏吗?
这是我的情况:
我们正在尝试将我们正在开发的项目转换为使用子模块。由于我们之前进行了测试,因此子模块仅指开发分支。现在我想将所有模块转换为从开发分支指向主分支上的特定发布标签。其中一个模块还需要更改远程 URL,因此我按照这些说明修改 .gitmodule 文件并更新远程 url 和分支;git submodule update --init --recursive --remote我什至执行了我需要从根级别目录执行的评论。然后我按照这些说明进行操作,进入每个子模块,检查每个子模块中各自的发布标签。
这似乎工作正常,但是当我运行时git status,它抱怨有一个分离的头(我想这是预期的,因为我检查了分支上的标签而不是实际的分支本身)。但是,我随后git add编辑了所有子模块并提交给我的本地存储库,但尚未推送,因为我实际上不确定子模块是否指向所需的标签。
那么,我如何验证当同事克隆这个项目时,它将在我希望设置的发布标签引用的状态下拉取子模块?我尝试查看 .gitmodule 文件,希望看到“标签”值,但什么也没有。我还检查了各个 .git/module/sub_module_path/config 文件,但这里也没有看到任何内容。
我如何确保子模块将被克隆到所需的标签?
好吧,这让我发疯。我尝试使用在另一个程序(XLS 电子表格)中打开的子模块中的文件来提交/推送/更新父存储库。操作“成功”,仅出现Couldn't unlink old somefile.xls警告。
现在我正在尝试git submodule update,但它一直指向向后几步的旧提交。Git log子模块main分支上显示这HEAD是本地和远程的最新提交,但是每当我cd来回父存储库时,它都会detached以这个旧提交结束。
.git/modules/mysubmodule/HEAD我尝试手动更新(指向这个旧提交)中的引用,但显然这不是事情的工作方式。我怎样才能摆脱这个令人沮丧的循环?我想对子模块进行一些无关紧要的更改并进行新的提交可以修复它(尽管我尝试了一个空提交,但没有运气),但我想更好地了解发生了什么,这样我就可以在将来避免这种情况。
这是我的子模块git log:
commit 713a39e531463eb9a9a608344ca39acbe520c7c4 (HEAD -> main, origin/main, origin/HEAD)
输出如下git submodule update:
Submodule path 'data': checked out '7e4dc2354f5e60a8efb101a5d8a03466a911d86f'
我正在写我的论文,我在那里扩展了另一篇论文。本文已在存储库 X 中公开了他们的所有代码,同时还使用了自己的子模块:我们将其称为 Y。
对于我自己的项目,我创建了一个自己的存储库 Z,其中包含 X 作为子模块,因此 Y 作为嵌套子模块。但是,我想对 X 和 Y 中的代码进行更改,并且还能够将其推送到我自己的存储库,以便我可以在多个位置使用它。我没有 X 和 Y 的推送权限,因为它是别人的仓库。解决这个问题的最佳方法是什么?预先感谢,我迷路了:D
我尝试将我自己的存储库推送到其主目录中,但它不包含我在子模块中更改的代码。当我进入子模块并在那里提交更改的代码时,我首先发出了分离头的警告。当我通过签出新分支来修复此问题时,它现在给我:
git push --set-upstream origin new_branch
ERROR: Permission to \[repo X\] denied to \[myusername\].
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Run Code Online (Sandbox Code Playgroud)
我现在分叉了存储库 X 并更改了 .gitmodules 中的 url。子模块 Y 现在发生了什么?
我希望通过在病原体的帮助下使用github repos作为子模块来使我的Vim插件与git保持同步.除了病原体本身,一切都很好.
例如,我有一个存储库~/.vim,在pathogen的repo中有autoload一个根目录:<pathogen repo>/autoload.
是否有可能制作一个git子模块,以便病原体autoload进入~/.vim?
~/.vim/autoload/pathogen.vim
Run Code Online (Sandbox Code Playgroud) 我的应用程序使用Mochiweb.据我所知,rebar当我运行时从Github获取最新版本make,因为有一行rebar.config:
{deps, [
{mochiweb, ".*",
{git, "git://github.com/mochi/mochiweb.git", "master"}}
Run Code Online (Sandbox Code Playgroud)
我的应用程序有一个VCS,它是git.所以,基本上我在另一个内部有一个git存储库:
myapp
.git
deps
mochiweb
.git
src
etc
Run Code Online (Sandbox Code Playgroud)
我知道在另一个内部添加一个git存储库并不是一个好主意(git add .).应该使用Git子模块功能.
所以,我将deps/mochiweb目录作为子模块添加到主git存储库中.
问题是当另一个开发人员克隆他必须的主存储库init和update子模块时,为了得到deps/mochiweb(否则它将是空的).
如果开发人员make在克隆主存储库后立即运行,则Makefile会显示以下内容:
ERROR: Dependency dir deps/mochiweb failed application validation with reason:
{missing_app_file,"deps/mochiweb"}
make: *** [all] Error 1
Run Code Online (Sandbox Code Playgroud)
我的问题是:在Erlang应用程序的deps中添加另一个应用程序以允许其他开发人员在不使用git子模块的情况下轻松更新的正确方法是什么?
请注意,我是Git的新手.
我有两个回购:
主存储库是Libgdx REPO,我的所有工作都进入了这个存储库,主要是在gdx-sqlite项目中.由于我希望gdx-sqlite项目作为一个单独的存储库出现,我所做的是:
这导致一切都出错了,我认为嵌套存储库是主要的罪魁祸首.后来我删除了本地嵌套存储库并恢复到之前的提交.我发现这种问题的解决方案是Git Submodules但是我完全迷失了我想要实现的目标,如下所示.
现在我应该如何根据以下内容实现这一目标:
怎么可以这样做?
最初添加子模块时,我指定了一个特定的分支,如.gitmodule文件所示:
[submodule "externals/grpc/grpc"]
path = externals/grpc/grpc
url = git@github.com:me/grpc.git
branch = release-1.0
Run Code Online (Sandbox Code Playgroud)
我想更改为我的子模块的master分支,所以我将分支.gitmodules从更改release-1.0为master,并且很好地,只是从父git树中删除了该子模块:
cd $submodules
rm -rf grpc
cd $gitroot
git submodule sync
git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)
现在,当我返回子模块时,它仍然是从release-1.0分支上的提交而不是最新的主提交中检出的。
我缺少什么步骤来切换子模块的分支?
考虑以下三个项目。
ProjectA没有任何依赖关系,其CMakeLists.txt顶层如下所示,
cmake_minimum_required(VERSION 2.8.4)
project(A CXX)
add_library(a ${PROJECT_SOURCE_DIR}/liba.cpp)
Run Code Online (Sandbox Code Playgroud)
ProjectB取决于ProjectA,我将其添加ProjectA为git-submodule,因此其结构如下所示,
ProjectB
CMakeLists.txtlibb.cppProjectA (git子模块)
CMakeLists.txtliba.cpp和ProjectB的CMakeLists.txt如下所示
cmake_minimum_required(VERSION 2.8.4)
project(B CXX)
add_subdirectory(ProjectA)
add_library(b ${PROJECT_SOURCE_DIR}/libb.cpp)
target_link_libraries(b a)
Run Code Online (Sandbox Code Playgroud)
到目前为止,还好。
现在,我们说它来了ProjectC。它取决于ProjectA和ProjectB。并假设我不知道该ProjectB依赖关系ProjectA已经存在(例如,我之前没有创建过这两个ProjectC依赖关系。或者认为实际上有很多依赖关系,因此我不会被迫找出其中的确切依赖关系树)。
无论如何,我都将ProjectA和ProjectB作为git子模块添加到中ProjectC。因此,它具有以下结构,
ProjectC
CMakeLists.txtlibc.cppProjectA (git子模块)
CMakeLists.txtliba.cppProjectB (git子模块)
CMakeLists.txtlibb.cppProjectA(子模块的git子模块ProjectB)
CMakeLists.txtliba.cpp并且具有以下内容CMakeLists.txt。
cmake_minimum_required(VERSION …Run Code Online (Sandbox Code Playgroud) 背景
我有一个Python应用程序,它依赖于另一个作为git子模块提供的包,产生类似于以下内容的目录结构:
foo/
bar/
bar/
__init__.py
eggs.py
test/
setup.py
foo/
__init__.py
ham.py
main.py
Run Code Online (Sandbox Code Playgroud)
从顶层目录执行该访问foo包就足够简单了。但是该程序包嵌套在另一个目录中,不能直接导入。main.pyfoo/barbar
通过sys.path在以下内容的开头进行修改,可以轻松解决此问题main.py:
import sys
# Or sys.path.append()
sys.path.insert(0, './bar')
from bar.eggs import Eggs
from foo.ham import Ham
Run Code Online (Sandbox Code Playgroud)
(注意:此代码示例假定main.py将始终从中调用foo/;如果情况并非如此,则'.bar'可以将其替换,os.path.join(os.path.dirname(__file__), 'bar')尽管这样做显然比较麻烦。)
问题
不幸的是,pylint不喜欢这种解决方案。当代码工作时,lint认为sys.path修改是结束于“模块顶部”的代码块,并给出了不希望的wrong-import-position警告:
C: 6, 0: Import "from bar.eggs import Eggs" should be placed at the top of the module (wrong-import-position)
C: 7, 0: Import "from foo.ham …Run Code Online (Sandbox Code Playgroud) git-submodules ×10
git ×8
github ×2
repository ×2
cmake ×1
conventions ×1
erlang ×1
git-fork ×1
git-push ×1
git-remote ×1
mochiweb ×1
pylint ×1
python ×1
rebar ×1
tags ×1