标签: git-submodules

来自Hg repo的git子模块?

我有一个非常古老的项目,直接包含来自另一个项目的源代码,而不是将其作为库链接.回到糟糕的日子,当我将所有内容保存在CVS中时,我在供应商分支上有外部代码并定期导入.既然我的项目是在git中,那么将外部项目作为子模块包含起来会更有意义.但是,存在一个问题:外部项目已迁移到Mercurial.我找到了git-hg和hg-git项目,但我不确定是否有人正确处理子模块.

有没有办法创建一个指向Hg仓库而不是git仓库的git子模块?

git mercurial git-submodules

21
推荐指数
1
解决办法
5773
查看次数

使用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)

git git-submodules

21
推荐指数
2
解决办法
2737
查看次数

如何添加git repo作为自身的子模块?(或者:如何以编程方式生成GitHub页面?)

我想开始在我的项目网站上使用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)

git github git-submodules

21
推荐指数
2
解决办法
4228
查看次数

通过https更新Git子模块

我坐的代理只允许http/https流量,我能够从Github克隆存储库,但我必须使用https URL和用户名/密码来获取/推送.

现在我的问题是一个包含子模块的存储库,当我执行git submodule update它超时时,我只能假设这是因为它使用了被阻止的SSH连接.(它甚至没有要求我提供私人回购的密码)

git proxy git-submodules

21
推荐指数
3
解决办法
2万
查看次数

将git子模块移动到另一个目录后,它失败,并且子模块中出现错误'git status --porcelain'失败

最初我有以下(简化)回购结构:

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-submodules

21
推荐指数
2
解决办法
2万
查看次数

Git命令行 - 知道是否在子模块中?

有没有办法在git中知道你是否在子模块中?您可以git submodule foreach在父目录中进行思考,但是如果您在子模块中的任何子目录中,或者在子模块内的任何子目录中,我似乎无法想出一个通用的方法来显示您在子模块中.

我想你可以找到repo root git rev-parse --show-toplevel,然后cd一个级别,然后再次查找该repo的根,然后将子模块列表与当前目录进行比较,但这看起来很粘...

git bash command-prompt git-submodules

20
推荐指数
3
解决办法
5708
查看次数

Git子模块与Nuget包

我们的团队已经尝试使用git子模块来实现我们大多数产品共享的一些核心CRUD功能.我们还成功地使用了Nuget软件包(现在自托管)用于一些常见的实用程序.

我们的核心功能经常发生变化,以确保子模块正确承诺,这更像是我们所期望的苦差事.我正在考虑将核心功能从子模块移动到Nuget包,但我想知道对包的频繁更新是否会让Nuget更加痛苦.

在对我们的架构和流程进行这种稍微干扰性的更改之前,是否有任何人对我可能遇到的其他挑战有任何经验和指导?

git git-submodules nuget nuget-package

20
推荐指数
2
解决办法
3897
查看次数

Git使用子树或子模块来管理外部资源

我读了很多关于git子模块应该是多么可怕,但我不确定这是否只是那些觉得有限的人的呻吟,或者是否有严重的问题(特别是关于我的用例).

我只想将不同的回购包含在我的回购中

website/
 libs/
  js/
   fs-slides [external]
   fs-dialog [external]
Run Code Online (Sandbox Code Playgroud)

并且有可能轻松更新这些回购.据我所知,从回购中只包含一个文件是不容易的,对吧?(但没关系.)

我应该使用子模块吗?
或者它有什么问题吗?或者子树更容易吗?

git git-submodules git-subtree

20
推荐指数
1
解决办法
9522
查看次数

如何重命名包含子目录中子模块的git repo(项目)

我从不期望重命名git repo,更具体地说,它是顶级文件夹保存项目,会非常困难.是的,项目包含一些子模块,但它是需要重命名的顶级文件夹,而不是子模块文件夹.Git似乎在其子模块机制中记录了一些奇怪的绝对路径.

让我们假设一下

  1. 你所有的项目都在/tmp.
  2. 你有一个proj_masterproj_mod.
  3. 您克隆porj_master,proj_ALL然后克隆prom_mod为其中的子模块.
  4. 你重命名proj_ALLproj_onebillion.然后黑魔法发生了.

以下步骤将重现我提到的问题.我使用的git版本是:

$ git --version
git version 1.7.9.5
Run Code Online (Sandbox Code Playgroud)
  1. 初始化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)
  2. 初始化proj_mod.

    $ cd /tmp
    $ mkdir proj_mod; cd proj_mod
    $ git init .
    $ touch …
    Run Code Online (Sandbox Code Playgroud)

git git-submodules

19
推荐指数
2
解决办法
3651
查看次数

确保相对Git路径

我已将Git存储库(包含多个子模块)移动到本地磁盘上的另一个目录.任何git命令都会产生错误:

fatal: Not a git repository: <absolute path to .git/modules/*>
Run Code Online (Sandbox Code Playgroud)

该错误源自在各个地方编码的文件的绝对路径[1].两个问题:

  • 是否有用于修复这些路径的Git命令,即使它们相对?[2]
  • 有没有办法确保未来的Git存储库只使用相对路径?[3]

谢谢!


笔记

  1. 我注意到,对于所有子模块,该.git文件包含:

    gitdir: <absolute path to repository>
    
    Run Code Online (Sandbox Code Playgroud)

    core.worktree每个子模块(.git/modules/*/config)中的参数设置为该子模块的绝对路径.

  2. 我不是在寻找一个shell命令,而是一个原生的Git方法.

  3. 我不确定是否使用较旧版本的Git创建了绝对路径,而更新的路径是否采用了相对路径.

git git-submodules

19
推荐指数
2
解决办法
3779
查看次数