代码之家  ›  专栏  ›  技术社区  ›  Wernight

Git提交到公共子模块(主分支)

  •  50
  • Wernight  · 技术社区  · 14 年前

    我有两个或更多的项目(我们称之为 项目Foo 项目栏 )有一些 通用代码 .

    我的理解是,如果我从内部提交对子模块的更改 项目Foo 在一个超然的头脑里 项目Foo 克隆人可以看到:

    (master) $ cd ProjectFooBarCommoneSubmodule/
    (master) $ git commit -am "Common code fix."
    (56f21fb0...) $ git push
    Everything up-to-date
    

    那可能是因为 master 分支没有改变。我也许可以做些 git checkout master && git merge Everything up-to-date 但这看起来很难看。可能是一个 git reset --hard master 会做同样的事,但看起来更难看。

    如何让项目共享公共代码,更新 从内部 存储库,而不仅仅是克隆 )使用相同的子模块。

    很明显,我签出的存储库乱七八糟。它应该从一开始就这样起作用

    (master) $ cd ProjectFooBarCommoneSubmodule/
    (master) $ git commit -am "Common code fix."
    (master) $ git push
    ....
       fbfdd71..0acce63  master -> master
    (master) $ cd ..
    (master) $ git add ProjectFooBarCommoneSubmodule
    (master) $ git commit -m "Submodule update."
    

    然后从其他项目中得到改变,比如 项目栏 :

    (master) $ cd ProjectFooBarCommoneSubmodule/
    (master) $ git pull
    

    将更新到最新的通用代码。A git checkout master 如果是在分离的头上可能需要。

    6 回复  |  直到 10 年前
        1
  •  76
  •   Sarasranglt    6 年前

    cd ProjectFooBarCommoneSubmodule
    git checkout master
    <Do your editing>
    git commit --all -m "Lots of fixes"
    git push submodule_origin master
    cd ..
    
    git add ProjectFooBarCommoneSubmodule
    git commit -m "Bumped up the revision of ProjectFooBarCommoneSubmodule"
    git push origin master
    

    长的那个:

    B的状态是存储在A中(签出 git submodule status ),并且修订更改必须在a中完成并提交,以使其生效。在上面的示例中就是这样,A更改存储在repo中的修订号,并将版本升级到最新版本。这一过程也必须在另一个主回购中重复,因此没有自动的“使用主”开关AFAIK。

    顺便说一句 Git book chapter on submodules 以及 submodule man page 包含大量关于子模块的有用信息,如正常用法和典型陷阱。值得一看。


    编辑:我会尽量解释得更好

    我冒昧地在上创建了示例项目 my github account

    ProjectFoo和ProjectBar都共享公共子模块中的代码。

    6850E4C1FAC49DE398型

    在ProjectFoo中:

    git submodule status
    

    -6850E4C1FAC49DE39890703F21486CA04B87A0普通

    在ProjectBar中:

    git子模块状态
    

    -6850E4C1FAC49DE39890703F21486CA04B87A0普通

    所以两者都指向同一个版本,对吗?这里的技巧是看,ProjectFoo和ProjectBar指向 修订 (6850E4C1FAC49DE39890703F21486CA04B87A0) 不是分支机构 (师父),虽然他们是同一件事。第一个是分离的头,另一个是命名的分支。

    如果您想对ProjectFooBarCommoneSubmodule进行一些修复,可以转到ProjectFoo中的子目录,然后 :

    git checkout master 
    <Do your coding and pushing here>
    

    然后转到一个目录,检查git子模块的状态。它应该告诉你,你现在不同步了。例如

    git子模块状态
    

    现在可以执行git add,设置对这个特定commit的引用(ge24bd…),执行commit,然后子模块引用指向这个修订版,这个修订版恰好也是ProjectFooBarCommoneSubmodule的主版本。

    git checkout master 
    cd ..
    git add common
    git commit -m "Bumped up the revision"
    git push origin master # to publish the revision bump to everybody else
    

    因此,与任何git存储库一样,您不需要在分离的头上工作。您可以使用master,也可以创建命名分支。不管是哪种方式,都要确保upstream包含ProjectFooBarCommoneSubmodule更改,否则如果ProjectFoo和ProjectBar引用了不存在的内容,您将同时中断它们。希望这能更好的解释

        2
  •  5
  •   Richard Erickson Snow R    8 年前

    submodule git push origin HEAD:master

        3
  •  1
  •   rivanov    7 年前

    我只是想:

    git submodule foreach git push -u origin master

        4
  •  1
  •   Fabrizio Stellato    6 年前

    注意:

    git submodule foreach 'git commit -a'
    

    如果其中一个子模块不包含要执行的提交,则将失败。

    git submodule foreach "git commit -am 'your comment' || echo ' '"
    

    通过使用echo管道,可以强制整个命令返回0,并继续在其他子模块上执行commit命令

        5
  •  1
  •   Kirk Beard    6 年前

    如果要同时提交和推送所有子模块,请执行以下操作:

    git submodule foreach 'git commit -a' ;
    git submodule foreach 'git push --all' ;
    git commit -a && \
    git push --all --recurse-submodules=on-demand
    
        6
  •  0
  •   kenorb    8 年前

    要将从分离的磁头更改为主磁头,请运行:

    git rebase HEAD master
    

    -f 对于力):

    git checkout master
    

    git submodule foreach ,例如。

    git submodule foreach git pull origin master -r