忽略git子模块中的更改

时间:2018-07-05 22:23:07

标签: git

我知道Stackoverflow上已经有一个问题。但是它讨论了如何避免这种情况,即从一开始我们就希望忽略新的提交。我已经有一个Go存储库,它具有go-build目录,该目录本身就是一个子模块。当我执行git status时,收到以下消息:

On branch x/y
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:   go-build (new commits)

no changes added to commit (use "git add" and/or "git commit -a")

是否可以将更改保留在本地,但可以避免将go-build中的提交推送到master?我看到有一种方法可以通过将目录/文件添加到.git / info / exclude文件中来进行处理,但这不适用于子模块。

1 个答案:

答案 0 :(得分:0)

  

是否可以将更改保留在本地,但避免将go-build中的提交推送到主服务器?

是的,当然是可能。究竟这是明智的选择,还是您想如何去做,完全是另一个问题。

这里的关键是要理解每个子模块都是其自己的单独的专用存储库。超级项目(引用子模块的Git存储库)中存储了三部分信息。其中两个是您将传递给git clone以获得子模块存储库的内容:

git clone <url> <path>

第三条信息存储在超级项目中的每个commit 1 中,这是上述git clone应该在执行后检查的一个特定提交的原始哈希ID。克隆完成。

如果您的子模块具有您未交付到其他地方的新提交,但是在您的超级项目中,您要做记录这些新提交之一的哈希ID,在其他任何地方都不存在,那么:

    运行git clone
  • 其他人 将获得该子模块的副本,但是
  • 当他们的超级项目Git转到git checkout指定的哈希ID时,该哈希ID将不在子模块克隆中

所以他们会得到一个错误。

另一方面,如果您在超级项目中记录新的哈希ID,那么谁在做超级项目的克隆,并要求他们的克隆也克隆子模块,会检出 old 哈希ID,这很好-但它们将检出一个不同的子模块。它们的构建可能会起作用,也可能不会起作用,这取决于子模块中发生了什么变化。

另一方面, 2 总是可以继续进行,并在超级项目中提交新的哈希ID,因为您的超级项目可能已经具有与子模块的早期版本一起使用的较早提交。因此,任何在“第一手”阶段中遇到问题的人都可以签出超级项目中的较早提交。因此,无需在任何地方推送这个特定的超级项目提交-在这种情况下,超级项目的其他用户甚至不会看到具有新哈希的提交子模块的ID。在这种情况下,问题就不会出现。

因此,这完全取决于您想要的结果


1 从技术上讲,它位于 tree 对象中,该对象要么是提交的顶级树对象,要么是某些子树,具体取决于<path>子模块。此信息与其他两个信息之间的主要区别在于,其他两个信息位于任何人都可以读取或编辑的普通文件中:名为.gitmodules的文件。提交哈希ID存储在内部使用的Git对象中,用户通常不会直接看到它。

2 也许是gripping hand还是第一只脚。