在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
根据answer:
,文件master/.gitmodules
内部如下所示
[submodule "book"]
path = book
url = https://user@bitbucket.org/user/repo.git
ignore = dirty
根据此answer:
将master/.gitmodules
更改为以下内容
[submodule "book"]
path = book
url = https://user@bitbucket.org/user/repo.git
ignore = untracked
根据此answer编辑master/.git/config
以下内容:
[status]
showUntrackedFiles = no
将book目录添加到主忽略文件中:
$ cd /path/to/master/
$ echo book > .gitignore
将书籍目录添加到主文件中,如下所示:
$ 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的文章表明这是一个不合适的子模块用法?
答案 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 1b614c0,commit 1f8d711,commit bb62e0a,commit 3e7eaed,commit a086f92(2017年3月17日)和commit ee92ab9,{{3} {,commit 25b31f1,commit e7849a9,commit 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 这允许用户采用至少两个新的工作流程:
- 子模块可以与前导目录分组,例如路径规范,例如'
lib/
'将涵盖所有库模块,以便让那些对库模块感兴趣的人只需设置一次“submodule.active = lib/
”来说出“lib/
”中的任何和所有模块很有意思。- 一旦发明了pathspec属性功能,用户就可以使用属性对子模块进行标记以对其进行分组,以便具有属性要求的广泛路径规范,例如, “
醇>:(attr:lib)
”可以用来表示具有“lib
”属性的所有模块都很有趣。
由于.gitattributes
文件与.gitmodules
文件一样,由超级项目跟踪,当子模块在超级项目树中移动时,项目可以调整哪个路径获取.gitattributes
中的属性,就像它可以调整.gitmodules
中的子模块的路径一样。
答案 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
在根级别。