在我的项目中 .git/modules 文件夹被删除。现在我可以将父分支重置为其他版本,但子模块更新不起作用。
我收到的错误:
fatal: Not a git repository: ../.git/modules/abc.
Unable to find current revision in submodule path 'abc'
Run Code Online (Sandbox Code Playgroud)
如何恢复已删除的文件夹并使子模块恢复与父分支一致。
回购结构是这样的:
parent_folder---|---abc
|---def
Run Code Online (Sandbox Code Playgroud)
abc 和 def 是子模块。
我被分配了一个项目,我将在其中进行后端开发,另一个人将负责前端开发。要求前端开发人员无法访问开发服务器,也无法访问项目代码。因此,我们决定为前端创建另一个存储库。
问题是我不知道如何使子模块在将某些内容提交到远程存储库时立即从远程服务器中提取。我需要开发人员提交并立即在前端看到更改。
我一直在阅读有关 git hooks 的内容,我发现我可以使用post-receivehook 来做到这一点。然而,它似乎不起作用。这是我所做的:
post-receive允许可执行权限的文件。文件内容post-receive:
#!/bin/sh
git pull
Run Code Online (Sandbox Code Playgroud)将更改从我的本地计算机推送到子模块存储库,但什么也没发生。
我究竟做错了什么?
编辑:我将澄清有关我的问题的一些观点。
我有两个存储库:“主”存储库,这是整个项目;另一个存储库,它是前端的东西(视图、资产等)。我们称之为“前端”存储库。
在我的主存储库中,我将前端存储库添加为子模块,位于 /submodules/frontend 内。这样,外包的前端开发人员将无法看到有关实际项目的任何信息。他们只会看到他们正在做的事情。
这实际上在访问控制方面非常有效,我可以轻松地与项目分开监控前端开发的进度。但有一个问题我不知道该怎么办。
我们的项目有两个独立的服务器 - 一个开发服务器和一个生产服务器。对于主存储库和前端存储库,开发服务器都需要始终位于主分支中。这样,前端团队和后端团队都可以看到他们的更新。尽管前端团队主要使用模板,但模板可以访问存储在数据库中的数据,并使用许多集成到后端的东西(例如模型)。
为了使这个“系统”正常工作,我需要前端存储库在“前端”远程存储库中有新提交时始终获取和合并。换句话说,如果前端团队git commit这样做git push,则开发服务器中的“前端”存储库子模块需要立即git pull。因此,当前端人员去测试他们的东西时,他们会立即看到最新的变化。
我读到该post-receive钩子可以做到这一点,但我需要这个钩子仅存在于子模块中。因此,经过一番挖掘,我发现所有子模块挂钩都存在于/.git/modules/submodules/frontend/hooks. 因此,我post-receive使用以下代码在该目录中创建了钩子:
#!/bin/sh
git pull
Run Code Online (Sandbox Code Playgroud)
但这没有用。我的问题是如何使钩子与子模块内的 post-receive 一起工作?
我知道我所采取的路线远非完美,但当涉及到允许开发人员仅访问一个目录而无需访问开发服务器时,这是对我来说唯一有意义的方法。
我希望这是有道理的。
无论如何,有没有告诉git submodule foreach以指定的子模块顺序运行.gitmodules?它似乎按字母顺序运行。
我希望 foreach 命令以添加子模块的顺序运行。
我有一个PayPal PHP 类库的 GitHub 存储库,并且有一个使用该库构建的[一组演示套件的单独 GitHub 存储库][2]。
演示套件存储库添加了类库作为 Git 子模块,并且还添加了 Bootstrap 作为子模块。这是我的 .gitmodules 文件...
[submodule "vendor/angelleye/paypal-php-library"]
path = vendor/angelleye/paypal-php-library
url = https://github.com/angelleye/paypal-php-library.git
[submodule "vendor/twbs/bootstrap"]
path = vendor/twbs/bootstrap
url = https://github.com/twbs/bootstrap.git
Run Code Online (Sandbox Code Playgroud)
由于某种原因,PayPal 库子模块不再工作。当我查看演示套件存储库并浏览子模块时,它显示了指向特定提交的链接......
不过,该提交似乎不再存在于存储库中,当我们单击该链接时,它会显示 GitHub 404 Not Found 页面。
目前不知道如何解决这个问题..?? 当我们运行时,git submodule update它会很好地引入 Bootstrap,但 PayPal 库由于链接/子模块损坏而失败。
不过,PayPal 库存储库仍然没问题,而且我本地的内容都与 GitHub 的内容相匹配,所以我不确定此时该怎么办。
任何有关如何修复子模块的信息将不胜感激。谢谢!
我在父文件夹中有一个 git 存储库。我们将此文件夹称为“根”。然后该文件夹中有一个子目录,我们称之为“child”。我想要做的是将远程存储库作为子模块克隆到“child”中:
git submodule add git@github.com:username/repopath child/
git submodule add git@github.com:username/repopath ./child/
Run Code Online (Sandbox Code Playgroud)
以上都给了我错误:
子项已存在于索引中
我尝试将目录从跟踪中删除:
git rm --cached .\child\*
git submodule add git@github.com:username/repopath child/
Run Code Online (Sandbox Code Playgroud)
然后我得到这个错误:
“child”已经存在并且不是有效的 git 存储库
非常感激任何的帮助
谢谢
我知道如何使用b2命令安装 Boost 并指定仅安装文件系统库。Boost 目录有很多我不需要的内容,而且克隆所有子模块需要很长时间。我有这个 cmake 文件可以下载、构建和安装 Boost。但我不知道如何指定要在CMakeLists.txt. 我用来ExternalProject_add下载、构建和安装 Boost。
cmake_minimum_required(VERSION 2.8)
include(ExternalProject)
# Download boost from git
SET (BOOST_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/boost/src/boost/lib/filesystem/include/boost/)
SET (BOOST_URL https://github.com/boostorg/boost.git )
get_filename_component(BOOST_STATIC_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/lib/libboost_filesystem.a ABSOLUTE)
if ( UNIX )
SET (BOOST_STATIC_LIBRARIES ${BOOST_BUILD}/libboost_filesystem.a)
endif ()
ExternalProject_Add(
boost
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/boost
GIT_REPOSITORY ${BOOST_URL}
UPDATE_COMMAND ./bootstrap.sh --with-libraries=filesystem,system
CONFIGURE_COMMAND ""
BUILD_COMMAND ./b2 link=static install --exec-prefix=${CMAKE_BINARY_DIR}/lib/ --includedir=${CMAKE_BINARY_DIR}/include/boost/
BUILD_IN_SOURCE 1
INSTALL_COMMAND ""
)
set(BOOST_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/lib)
message ("${BOOST_STATIC_LIBRARIES}")
Run Code Online (Sandbox Code Playgroud)
编辑
我现在有以下CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.8)
include(ExternalProject)
# Download boost from git …Run Code Online (Sandbox Code Playgroud) 我花了很多时间阅读和尝试 git 子模块。但我真的已经放弃了。
我的问题:
我正在将 git 存储库克隆为子模块。所以,我愿意
git submodule add -b master url localpath
Run Code Online (Sandbox Code Playgroud)
存储库开始下载,并在 .gitmodules 文件中创建相应的条目。git 子模块状态显示最新提交。
到目前为止,一切都很好。
开发过程中发现子模块中的HEAD commit有bug。因此,提交应该从 master 更改为某个提交 id。
因此,我将 .gitmodule 文件中的提交 ID ( 7 aplhanumeric ) 从branch = master 更改为
branch = <commitid> -> .gitmodule file
Run Code Online (Sandbox Code Playgroud)
并且做到了
git submodule update --remote
Run Code Online (Sandbox Code Playgroud)
错误是
致命:需要一次修改
无法在子模块路径中找到当前来源/修订版本
我也尝试过
git submodule foreach git pull
Run Code Online (Sandbox Code Playgroud)
这样它就会拉取提交 ID,但它只是返回
输入子模块的名称
已经是最新的了。
谁能帮帮我吗?
PS:我已经阅读了很多教程和问答。因此,如果您想为了好玩而投反对票,请先指出答案,我将删除这篇文章。
我正在尝试从我的存储库中删除子模块。这是我用来删除存储库的步骤:
Delete the relevant section from the .gitmodules file.
Stage the .gitmodules changes git add .gitmodules
Delete the relevant section from .git/config.
Run git rm --cached path_to_submodule
Run Code Online (Sandbox Code Playgroud)
但是当我运行此命令时, git rm --cached path_to_submodule我收到此错误:
fatal: Please stage your changes to .gitmodules or stash them to proceed
Run Code Online (Sandbox Code Playgroud)
如果运行git status我收到此消息:
fatal: Not a git repository:path to submodule
Run Code Online (Sandbox Code Playgroud)
你们中有人知道为什么或者如何删除子模块吗?
我将非常感谢你的帮助。
SmartGit 明确使用子模块更新策略no。我如何覆盖它以使用该策略on-demand?
SmartGit执行的命令:
git.exe fetch --progress --prune --recurse-submodules=no origin
我尝试用别名覆盖 fetch 命令:
git config --global alias.fetch 'git fetch --recurse-submodules=on-demand'
我在 SmartGit 的日志窗口中没有看到任何变化。
我试过git submodule update --init --recursive
并得到以下错误
error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
我的操作系统是window 10,我使用的是docker for windows。Docker图像是ubuntu:16.04