使用Git并知道何时更新或提交已更改的子模块

时间:2016-05-22 17:46:23

标签: git git-submodules

当我在状态中看到git add时,我正试图了解何时只需git commit / submodule update一个子模块,或(new commits)

注意:我可以将/form子模块的最终版本作为父级的一部分,即我很方便将子模块的当前状态整体整合到父母,如果这有助于了解。

予。查看.gitmodules以查看我的内容:

/main$ cat .gitmodules 
[submodule "xm_css/form"]
    path = xm_css/form
    url = https://github.com/HighgateCreative/form.css.git

II。检查子模块中的状态:

/main/form$ gs
HEAD detached at 1ce1544
nothing to commit, working directory clean

III。我使用了两种方法中的一种来重新连接HEAD(虽然经过大量阅读后认识到这是不必要的):

/main/form$ git checkout -b temp
Switched to a new branch 'temp'
bradc@highsite-dev:/var/www/cms/xm_css/form$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

VI。推到原点(现在我意识到,如果我将HEAD分离,这将不是必要的)

/main/form$ git push
Username for 'https://github.com': myemail@gmail.com
Password for 'https://myemail@gmail.com@github.com': 
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (10/10), 790 bytes | 0 bytes/s, done.
Total 10 (delta 4), reused 0 (delta 0)
To https://github.com/HighgateCreative/form.css.git
   1ce1544..272dc7b  master -> master

诉双重检查状态

/form$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

VI。父级(new commits)期间git status的外观

/main$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   xm_css/form (new commits)

Ⅶa因子。分析从git diff开始:

/main$ git diff
diff --git a/xm_css/form b/xm_css/form
index 1ce1544..272dc7b 160000
--- a/xm_css/form
+++ b/xm_css/form
@@ -1 +1 @@
-Subproject commit 1ce1544db293096a740312c4ad5486dd7922085c
+Subproject commit 272dc7baebe70b75da3da00d28ba97b52099ce55

VIIb的。分析继续git log

/main/submodule $ git log
commit 272dc7baebe70b75da3da00d28ba97b52099ce55
Author: Brad Cathey 
Date:   Thu Mar 3 12:00:28 2016 -0600

    trying to get buttons to display properly

commit f4141a2ec88de2efb550ec5b14426a54347312b2
Author: Brad Cathey
Date:   Thu Mar 3 10:57:56 2016 -0600

    adding type=button

commit 1ce1544db293096a740312c4ad5486dd7922085c
Author: John smith
Date:   Tue Nov 17 08:39:18 2015 -0600

    Set all 'buttons' to display inline-block

VIIc中。子模块git diff --submodule=log中继续进行分析:

/main$ git diff --submodule=log
Submodule xm_css/form 1ce1544..272dc7b:
  > trying to get buttons to display properly
  > adding type=button

思考这一切: 一个。 SHA不是按顺序排列的(思考update) 湾但是上一个>中的git diff让我思考commit,但不完全确定--submodule=log选项。

思想?

1 个答案:

答案 0 :(得分:0)

您在父回购中看到的是 gitlink (a special entry in the index),它记录了子模块的新SHA1。

每次修改和提交(并推送)子模块内容时,您都需要从父存储库添加,提交和推送该子模块的新SHA1(gitlink)。

SHA1不必按顺序排列:它只是反映了您选择用于检出子模块的提交。

git diff --submodule=log反映了你在子模块中做的新提交(而父repo只知道新的SHA1,而不是内容)

注意,使用Git 2.11(2016年第4季度),您将能够显示父代仓库中子模块内的实际差异。

请参阅commit fd47ae6commit 8e6df65commit 602a283commit 99b43a6commit 61cfbc0commit 660e113commit 8576fde(2016年8月31日) Jacob Keller (jacob-keller)commit cd48dad查看Junio C Hamano (gitster)(2016年8月31日) Junio C Hamano -- gitster --合并于commit 305d7f1,2016年9月12日)

git diff --submodule={short,log}”机制已得到增强,允许“--submodule=diff”显示绑定到超级项目的子模块提交之间的补丁。

请注意最后一个选项:在子模块中运行git diff --submodule=diff,该子模块有自己的子模块,但有更改会得到错误:

fatal: bad object.

只有Git 2.13(2017年第二季度)修复了这个错误:

commit 17b254cStefan Beller (stefanbeller)(2017年3月31日) Junio C Hamano -- gitster --合并于commit 1776a71,2017年4月17日)

  

这种情况发生了,因为我们没有正确初始化环境   差异在子模块中运行   这意味着我们从主进程继承环境,主进程设置环境变量。 (显然我们设置环境变量,当不在子模块中时我们没有设置,即.git目录已链接)