忽略git子模块的新提交

时间:2013-01-19 20:07:26

标签: git status git-submodules ignore

背景

在Linux上使用Git 1.8.1.1。存储库如下所示:

master
  book

子模块的创建如下:

$ cd /path/to/master
$ git submodule add https://user@bitbucket.org/user/repo.git book

book子模块是干净的:

$ cd /path/to/master/book/
$ git status
# On branch master
nothing to commit, working directory clean

问题

另一方面,主人显示书子模块有“新提交”:

$ cd /path/to/master/
$ git status
# On branch 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:   book (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")

Git应该完全忽略子模块目录,这样主服务器也是干净的:

$ cd /path/to/master/
$ git status
# On branch master
nothing to commit, working directory clean

尝试失败#1 - 脏

根据answer

,文件master/.gitmodules内部如下所示
[submodule "book"]
        path = book
        url = https://user@bitbucket.org/user/repo.git
        ignore = dirty

尝试失败#2 - 未跟踪

根据此answer

master/.gitmodules更改为以下内容
[submodule "book"]
        path = book
        url = https://user@bitbucket.org/user/repo.git
        ignore = untracked

尝试失败#3 - showUntrackedFiles

根据此answer编辑master/.git/config以下内容:

[status]
   showUntrackedFiles = no

尝试失败#4 - 忽略

将book目录添加到主忽略文件中:

$ cd /path/to/master/
$ echo book > .gitignore

尝试失败#5 - 克隆

将书籍目录添加到主文件中,如下所示:

$ cd /path/to/master/
$ rm -rf book
$ git clone https://user@bitbucket.org/user/repo.git book

问题

book子模块如何在master存储库下的自己的存储库目录中但git忽略book子模块?也就是说,不应显示以下内容:

#
#       modified:   book (new commits)
#

如何在主存储库中执行git status时禁止显示该消息?

关于git submodule pitfalls的文章表明这​​是一个不合适的子模块用法?

6 个答案:

答案 0 :(得分:90)

跑步:

$ git submodule update

这会将子模块还原为旧提交(在parent-repo中指定),而不用子模块的最新版本更新父repo。

答案 1 :(得分:54)

要包含另一个无需在其超级仓库中跟踪的存储库,请尝试以下操作:

$ cd /path/to/master/
$ rm -rf book
$ git clone https://user@bitbucket.org/user/repo.git book
$ git add book
$ echo "book" >> .gitignore

然后提交。

如链接git submodule pitfalls article中所述:

  

...父和子模块之间唯一的联系是子模块的签出SHA的记录值,该值存储在父提交中。

这意味着子模块不会通过其签出的分支或标记保存,但始终由特定的提交保存;提交(SHA)保存到super-repo(包含子模块的文件)中,就像普通的文本文件一样(当然,它被标记为这样的引用)。

当您在子模块中签出其他提交或在其中进行新提交时,超级仓库将看到其已检出的SHA已更改。那是从modified (new commits)获得git status行的时候。

要消除这种情况,您可以:

  • git submodule update,它会将子模块重置为当前保存在超级仓库中的提交(有关详细信息,请参阅the git submodule manpage;或
  • git add book && git commit将新SHA保存到超级仓库中。

正如评论中所提到的,考虑放弃book子模块:在超级回购中克隆它,如果不需要将其状态作为超级回购的一部分进行跟踪。

答案 2 :(得分:18)

您可以抑制两种更改通知(来自git 1.7.2)。

第一个是未经跟踪的内容,当您对子模块进行更改但尚未提交时,会发生这种情况。父存储库注意到这些并且git状态相应地报告它:

modified: book (untracked content)

你可以用以下方法来抑制它们:

[submodule "book"]
    path = modules/media
    url = https://user@bitbucket.org/user/repo.git
    ignore = dirty

但是,一旦您提交了这些更改,父存储库将再次注意并相应地报告它们:

modified:   book (new commits)

如果你想要抑制这些,你需要忽略所有的改变

[submodule "book"]
    path = book
    url = https://user@bitbucket.org/user/repo.git
    ignore = all

答案 3 :(得分:9)

Git 2.13(2017年第二季度)将添加另一种方式来包含一个不需要由其父级仓库跟踪的子模块。

在OP案例中:

git config submodule.<name>.active false

请参阅commit 1b614c0commit 1f8d711commit bb62e0acommit 3e7eaedcommit a086f92(2017年3月17日)和commit ee92ab9,{{3} {,commit 25b31f1commit e7849a9commit 6dc9f01(2017年3月16日)commit 5c2bd8b
Brandon Williams (mbrandonw)于2017年3月30日Junio C Hamano -- gitster --合并)

  

submodule:解除网址和子模块的兴趣

     

目前submodule.<name>.url配置选项用于确定是否   给定的子模块是用户感兴趣的。这最终成为了   在我们想要检查不同子模块的世界中,这很麻烦   在不同的工作中或更广泛的机制来选择   哪些子模块是有意义的。

     

在具有子模块的工作树支持的未来,将有多个   工作树,每个工作树可能只需要子模块的子集   签出。
  URL(可以获取子模块存储库的位置)在不同的工作树之间不应该有所不同。

     

用户也可以更方便地指定组   他们感兴趣的子模块,而不是在他们希望在工作中检查的每个子模块上运行“git submodule init <path>”   树。

     

为此,我们引入了两个配置选项,submodule.active和   submodule.<name>.active

     
      
  • submodule.active配置包含一个pathspec,用于指定工作树中应存在哪些子模块。      
        
    • submodule.<name>.active config是一个布尔标志,用于指示是否   该特定子模块应存在于工作树中。
    •   
  •   
     

重要的是要注意submodule.active的功能不同于   其他配置选项,因为它需要一个pathspec   这允许用户采用至少两个新的工作流程:

     
      
  1. 子模块可以与前导目录分组,例如路径规范,例如'lib/'将涵盖所有库模块,以便让那些对库模块感兴趣的人只需设置一次“submodule.active = lib/”来说出“lib/”中的任何和所有模块很有意思。
  2.   
  3. 一旦发明了pathspec属性功能,用户就可以使用属性对子模块进行标记以对其进行分组,以便具有属性要求的广泛路径规范,例如, “:(attr:lib)”可以用来表示具有“lib”属性的所有模块都很有趣。
      由于.gitattributes文件与.gitmodules文件一样,由超级项目跟踪,当子模块在超级项目树中移动时,项目可以调整哪个路径获取.gitattributes中的属性,就像它可以调整.gitmodules中的子模块的路径一样。
  4.   

答案 4 :(得分:0)

Nevik Rehnel回答肯定是你要问的正确答案:我不想要一个子模块,我怎么能摆脱这种情况?!

只有,如果您的master项目需要book子模块,那么这样做是一个很好的姿态,因为这样一来,签出项目的其他用户可以享受到没有任何特殊的{{ 1}}命令运行(嗯......有一些特殊的命令可以使用子模块,但总的来说,它仍然更易于管理。)

在您的情况下,您在git存储库中进行更改,并在某些时候提交这些更改。这意味着您在该子模块中有 new commits ,它具有新的SHA1引用。

您需要在主目录中执行的操作是在主存储库中提交这些更改。

book

这会将cd /path/to/master git commit . -m "Update 'book' in master" 中的SHA1引用更新为master存储库中提供的最新版本。因此,此提交允许其他人签出所有book&amp;提示中的master个存储库。

因此,每当您对子模块进行更改时,最终会再次提交一次。如果您同时对book存储库中的某些文件进行更改,则它是半透明的。

答案 5 :(得分:-4)

运行

git submodule update 

在根级别。