我有一个非常古老的项目,直接包含来自另一个项目的源代码,而不是将其作为库链接.回到糟糕的日子,当我将所有内容保存在CVS中时,我在供应商分支上有外部代码并定期导入.既然我的项目是在git中,那么将外部项目作为子模块包含起来会更有意义.但是,存在一个问题:外部项目已迁移到Mercurial.我找到了git-hg和hg-git项目,但我不确定是否有人正确处理子模块.
有没有办法创建一个指向Hg仓库而不是git仓库的git子模块?
我在Git中有一个包含多个子模块的项目,我需要下载这些子模块以及可用的文件以便使用主项目,并且为了使子模块工作,我需要自己的子模块可用等等.所以为此设置我使用递归初始化子模块git submodule update --init --recursive.
但是,我注意到我的许多子模块都有共享依赖关系,在伪代码中看起来像这样(alpha -> beta表示alpha具有子模块beta)
my project -> submodule a -> submodule m
-> submodule b -> submodule m
-> submodule n -> submodule x
-> submodule c -> submodule x
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有办法只使用git来避免这种重复,同时仍然拥有每个子模块的文件(至少有一个副本)?
我可以想象一个带符号链接的解决方案,但如果git为我处理这个问题会更好,而且我不确定在更新子模块时自己输入符号链接是否会引起问题.
理想情况下,我希望将其简化为:
my project -> submodule a -> symlink(submodule m)
-> submodule b -> symlink(submodule m)
-> symlink(submodule n)
-> submodule c -> symlink(submodule x)
-> submodule m
-> submodule n -> symlink(submodule x)
-> submodule x …Run Code Online (Sandbox Code Playgroud) 我想开始在我的项目网站上使用GitHub Pages.这只需要gh-pages在repo中命名的分支(子树),并提供其内容.问题是网站的一部分(手动,更改日志,下载页面......)是由构建系统自动生成的,所以我想找到gh-pages在主要仓库保持打开时将这些更改提交到分支的最佳方法master(或任何地方).
为了提交gh-pages分支,我可以编写一个脚本,将repo克隆到一个临时目录中,进行修改,提交它们,然后将它们推回到主repo.但这听起来像一个容易出错的过程,所以我希望有一个更简单的方法.
一位朋友建议我可以将gh-pages分支作为子模块添加到主存储库中.我做了一个小实验,但它不太有效:
$ git init main
Initialized empty Git repository in /tmp/main/.git/
$ cd main
$ touch main.txt
$ git add .
$ git commit -m'Initial commit in main branch.'
[master (root-commit) 1c52a4e] Initial commit in main branch.
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 main.txt
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx
Removing main.txt
$ touch index.html …Run Code Online (Sandbox Code Playgroud) 我坐的代理只允许http/https流量,我能够从Github克隆存储库,但我必须使用https URL和用户名/密码来获取/推送.
现在我的问题是一个包含子模块的存储库,当我执行git submodule update它超时时,我只能假设这是因为它使用了被阻止的SSH连接.(它甚至没有要求我提供私人回购的密码)
最初我有以下(简化)回购结构:
MyRepo
external1/MySub (git submodule)
.gitsubmodules
Run Code Online (Sandbox Code Playgroud)
哪里
$ cat .gitsubmodules
[submodule "external1/MySub"]
path = external1/MySub
url = user@repo:/remoterepo/externals/MySub.git
Run Code Online (Sandbox Code Playgroud)
然后我想将MySubmodule移动到同一个git存储库中的另一个目录,例如external2,所以结构如下:
MyRepo
external2/MySub (git submodule)
.gitsubmodules
Run Code Online (Sandbox Code Playgroud)
我做了什么,并且已经足够了,我只是将(通过操作系统mv)external1/MySub目录移动到external2/MySub并将.gitsubmodules文件编辑为:
$ cat .gitsubmodules
[submodule "external2/MySub"]
path = external2/MySub
url = user@repo:/remoterepo/externals/MySub.git
Run Code Online (Sandbox Code Playgroud)
在此更改后,我收到以下错误:
$ git status
fatal: Could not chdir to '../../../../../repo/external/MySub': No such file or directory
fatal: 'git status --porcelain' failed in submodule repo/external2/MySub
Run Code Online (Sandbox Code Playgroud)
我错过了什么?这种搬迁需要做出任何其他改变吗?
(我在Windows 8.1上使用git版本1.8.3rc3)
有没有办法在git中知道你是否在子模块中?您可以git submodule foreach在父目录中进行思考,但是如果您在子模块中的任何子目录中,或者在子模块内的任何子目录中,我似乎无法想出一个通用的方法来显示您在子模块中.
我想你可以找到repo root git rev-parse --show-toplevel,然后cd一个级别,然后再次查找该repo的根,然后将子模块列表与当前目录进行比较,但这看起来很粘...
我们的团队已经尝试使用git子模块来实现我们大多数产品共享的一些核心CRUD功能.我们还成功地使用了Nuget软件包(现在自托管)用于一些常见的实用程序.
我们的核心功能经常发生变化,以确保子模块正确承诺,这更像是我们所期望的苦差事.我正在考虑将核心功能从子模块移动到Nuget包,但我想知道对包的频繁更新是否会让Nuget更加痛苦.
在对我们的架构和流程进行这种稍微干扰性的更改之前,是否有任何人对我可能遇到的其他挑战有任何经验和指导?
我读了很多关于git子模块应该是多么可怕,但我不确定这是否只是那些觉得有限的人的呻吟,或者是否有严重的问题(特别是关于我的用例).
我只想将不同的回购包含在我的回购中
website/
libs/
js/
fs-slides [external]
fs-dialog [external]
Run Code Online (Sandbox Code Playgroud)
并且有可能轻松更新这些回购.据我所知,从回购中只包含一个文件是不容易的,对吧?(但没关系.)
我应该使用子模块吗?
或者它有什么问题吗?或者子树更容易吗?
我从不期望重命名git repo,更具体地说,它是顶级文件夹保存项目,会非常困难.是的,项目包含一些子模块,但它是需要重命名的顶级文件夹,而不是子模块文件夹.Git似乎在其子模块机制中记录了一些奇怪的绝对路径.
让我们假设一下
/tmp.proj_master和proj_mod.porj_master,proj_ALL然后克隆prom_mod为其中的子模块.proj_ALL为proj_onebillion.然后黑魔法发生了.以下步骤将重现我提到的问题.我使用的git版本是:
$ git --version
git version 1.7.9.5
Run Code Online (Sandbox Code Playgroud)
初始化proj_master.
$ cd /tmp
$ mkdir proj_master; cd proj_master
$ git init .
$ touch README
$ git add .; git commit -m "hello proj_master"
Run Code Online (Sandbox Code Playgroud)初始化proj_mod.
$ cd /tmp
$ mkdir proj_mod; cd proj_mod
$ git init .
$ touch …Run Code Online (Sandbox Code Playgroud)我已将Git存储库(包含多个子模块)移动到本地磁盘上的另一个目录.任何git命令都会产生错误:
fatal: Not a git repository: <absolute path to .git/modules/*>
Run Code Online (Sandbox Code Playgroud)
该错误源自在各个地方编码的文件的绝对路径[1].两个问题:
谢谢!
我注意到,对于所有子模块,该.git文件包含:
gitdir: <absolute path to repository>
Run Code Online (Sandbox Code Playgroud)
core.worktree每个子模块(.git/modules/*/config)中的参数设置为该子模块的绝对路径.
我不是在寻找一个shell命令,而是一个原生的Git方法.
我不确定是否使用较旧版本的Git创建了绝对路径,而更新的路径是否采用了相对路径.