如何暂存(git add)除嵌入式存储库之外的所有更改和新文件?

Posted

技术标签:

【中文标题】如何暂存(git add)除嵌入式存储库之外的所有更改和新文件?【英文标题】:How to stage (git add) all changes and new files except embedded repositories? 【发布时间】:2022-01-21 09:36:55 【问题描述】:

我经常使用sourcetree,当您在那里暂存时,它不包括嵌入式存储库。我不知道他们是如何做到的,但这就是我想通过命令行实现的。我在这里(https://git-scm.com/docs/git-add)通读了git add 的文档,但找不到任何可以实现这一点的东西。我可以使用 bash 脚本来实现这一点,但我想知道我是否遗漏了一些东西并且有更简单的方法可以做到这一点?

顺便说一句,我不想​​使用需要输入嵌入式存储库的确切名称的命令来解决这个问题,因为我有很多这样的清单存储库,我正在寻找一个通用的解决方案。

编辑:这里是如何自己复制它:通过创建任何 git repo 并在其中创建另一个 git repo。转到父仓库并执行git add .,您将看到 git 给您以下消息:

++++++++++++++++++++++

背景:

我有一个包含几个其他嵌入式存储库的存储库。 我使用清单文件(一个列出每个存储库及其关联提交和分支的文本文件)管理所有嵌入式存储库,当我想同步它们时,我只需使用我编写的 bash 脚本基于清单文件检查相关分支和提交.我正在构建一个实现多仓库管理解决方案的应用程序,该解决方案将子模块和谷歌仓库的功能与图形用户界面相结合。这就是为什么我在这里故意不使用子模块的原因。

【问题讨论】:

如果不使用子模块,“除子模块之外的所有更改和文件”不就意味着“所有更改和文件”吗? @mkrieger1 从我测试的结果来看并非如此。例如,如果我执行git add .git add -A,它也会暂存嵌入式存储库。 是的,但是如果它们不是子模块,那么添加“除了子模块”之外的所有内容的解决方案将无济于事。 这能回答你的问题吗? Git ignore .git folder - 如果没有,请显示minimal reproducible example。 @mkrieger1 关于您的第二条评论,您是对的。我修改了问题的标题。关于您的最后评论,我在问题中添加了一个可重现的示例。您作为可能的答案提供的链接确实提供了一个带有 post 和 pre commit 脚本的通用解决方案,但是,我觉得它不像下面 jthill 提供的答案那么优雅和简单。他只提供了一个预提交脚本的解决方案。 【参考方案1】:

我使用清单文件(一个列出每个存储库及其关联提交和分支的文本文件)管理所有嵌入式存储库,当我想要同步它们时,我只需使用 bash 脚本根据清单文件签出相关分支和提交我有。

您确实了解您的 bash 脚本实现了子模块,对吗? .gitmodules 是一个文本文件,列出了跟踪的历史记录、用于获取它们的原始存储库以及您在使用它们时喜欢使用的各种选项,git adding 嵌套存储库将其列在 Git 清单(即索引)中。

如果你拘泥于你做事的方式,我建议你使用 pre-commit 钩子从索引中刮掉任何添加的 gitlink 并更新并重新添加你的清单文件,然后可能会弹出如果做了任何更改,请注明。这就像一个五行代码(就像大多数 git submodule 命令可以实现为五行代码一样)。

git ls-files -cs | grep ^16

将列出您所有跟踪的历史记录。假设为简单起见,您将清单文件以该格式键入,则更新是直接的 sort -t$'\t' -usk2,2 | join 管道。

【讨论】:

这是一个很好的解决方案,因为它只是一个可以作为预提交脚本实现的脚本。我实际上会将它用作我的应用程序使用的 bash 脚本,该应用程序正在创建和管理我的所有清单存储库。我正在考虑实现这样的东西,但我希望有一种更简单的方法,比如我可能错过了 git add 的特殊标志。 我没有看到复制 Git 的子模块而不仅仅是使用它们的优势。对于足够小的项目,您不必担心入职,您不需要任何它,只需嵌套存储库并知道您的源代码来自哪里就足够了,子模块助手和您的系统都增加了复杂性但没有价值,但是一旦有了 README 开始为您节省时间让其他人加快速度,只需使用 Git 的子模块帮助程序,它就会有所帮助。 我尊重你所说的,但我相信是否使用子模块是一个更大的争论。您可以在线浏览,您会发现在线多个论坛讨论和关于子模块的优缺点和谷歌的repo工具的博客文章。因此,虽然某些事情对您来说可能看起来很直观和简单,但很多人的想法并不相同:)

以上是关于如何暂存(git add)除嵌入式存储库之外的所有更改和新文件?的主要内容,如果未能解决你的问题,请参考以下文章

我如何告诉 Git 忽略除子目录之外的所有内容?

如何从暂存区域中删除单个文件(撤消 git add)?

Git从青铜到王者第三篇:Git的基础

GitGit 基础命令 ( 添加暂存文件 git add | 提交文件至版本库 git commit | 查看版本库状态 git status | 查询文件修改 git diff )

GitGit 基础命令 ( 添加暂存文件 git add | 提交文件至版本库 git commit | 查看版本库状态 git status | 查询文件修改 git diff )

无法使用嵌入式对象发布 JSON - 它读取并存储除对象列表 (OneToMany) 之外的所有内容 - Spring Boot API (+ hibernate)