Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Git子模块混乱:如何在不熟悉Git的开发人员中使用Git子模块?_Windows_Git_Git Submodules - Fatal编程技术网

Windows Git子模块混乱:如何在不熟悉Git的开发人员中使用Git子模块?

Windows Git子模块混乱:如何在不熟悉Git的开发人员中使用Git子模块?,windows,git,git-submodules,Windows,Git,Git Submodules,我对使用git的子模块特性感到非常失望。要么我还是没弄好,要么就是没能像我期待的那样工作。给出了以下项目情况: Project | .git | projsrc | source (submodule) | proj.sln 在这个场景中,source指向另一个存储库,其中包含我们所有项目中的公共源数据。在source下以及在projsrc下都有很多发展。不幸的是,项目指向源子模块的某些提交,而不是它的实际头。据我所知,这是git通常的行为 我已经发现了 git submodu

我对使用git的子模块特性感到非常失望。要么我还是没弄好,要么就是没能像我期待的那样工作。给出了以下项目情况:

Project
  | .git
  | projsrc
  | source (submodule)
  | proj.sln
在这个场景中,source指向另一个存储库,其中包含我们所有项目中的公共源数据。在source下以及在projsrc下都有很多发展。不幸的是,项目指向源子模块的某些提交,而不是它的实际头。据我所知,这是git通常的行为

我已经发现了

git submodule update
只需获取与主项目一起提交的子模块版本。然而,我真的很想始终跟上子模块的开发,但没有任何真正的线索如何正确地做到这一点。因此,我的问题是:

是否可以将项目连接到子模块的头部, 不管这是否会破坏项目的编制。 我只是不想总是进入子模块
目录并在那里进行git拉取。因为我认为我可以放弃我的改变 在子模块目录中,因为这是简单的附加到 提交,而不是真的提交给任何分支

<强>请考虑以下约束< /强>:

  • 我们团队中的开发人员并不熟悉周围所有的风投。我们以前习惯于使用非常庞大的svn存储库,根本没有任何外部回购功能
  • 我们正在开发Windows
  • 单击“不”忘记解决方案是最好的,因为大多数项目成员对使用命令行界面感到非常害怕:)

    • 子模块指向特定版本的原因很重要。如果您指向头部,则生成将不可生成。也就是说,如果你签出昨天的某个版本的项目,你将永远不知道该项目的确切版本source@HEAD那是昨天

      这就是它总是存储特定版本的原因


      要拉取所有子模块,您可以使用

      我不擅长Git和子模块。但我认为一些简单的规则会很有帮助

    • 从子目录提交和推送
    • 返回到项目的根目录,如果需要提交并再次推送,请检查状态
    • 什么时候拉。可以尝试使用脚本将“拉/子模块更新”捆绑在一起。并且只在项目的根目录下进行

      考虑一下:

    • 源指向头部(如您所愿)
    • 在项目内部对源代码进行更改(提交但不推送)
    • 现在您有两个头部:一个在项目的源代码中,另一个在公共源代码中 在进行子模块更新时,您希望在项目中出现哪一个

      在你的例子中,GIT的问题(和主要特征)是你认为提交和推动是原子操作。事实并非如此。Git是分散的。没有共同的头脑。您可能有多个具有不同头的存储库

      考虑这一点:

    • 您有3个开发人员(A、B和C)负责一个git项目
    • 他们都是一个项目的负责人
    • 每个开发人员都对项目进行了更改
    • 现在他们每个人都有三个头:A头,B头和C头
    • 你认为哪个头是“真”头?< / P > 所以,为了回答您的问题:如果您希望公共源代码子模块始终与中央存储库同步,那么git不是您的选择。可能没有一个VCS会帮你

      您应将git子模块视为第三方库,应通过以下两个步骤手动更新:

    • 拉动您的子模块(“下载第三方库”)
    • 使用更新的子模块提交项目(“将新版本的第三方库放入项目”)
    • 如果要对子模块进行更改,应按相反顺序进行更改:

    • 提交子模块(“对第三方库进行更改”)
    • 推送子模块(“将更改发送给第三方库维护人员”)
    • 使用更新的子模块提交项目(“将新版本的第三方库放入项目”)

    • 我完全同意他们会分手,但我同意这种情况。我只是费心向每一个在我的项目上合作的非git熟悉的开发人员解释,子模块源代码并不像他们期望的那样工作。他们总是在源代码上提交/推送任何更改。更重要的是,如果他们只是在项目中更新git子模块,他们会丢失对源代码所做的所有更改,因为它们会被特定版本覆盖。
      submoduleupdate
      不会删除任何更改,正如我所知,它只是签出引用的版本。所做的更改仍在repo中,您可以签出它们,然后更新Project以引用修订,并将子模块修订引用提交到主项目。实际上,如果您尚未提交并推送更改(也未推送父项目中的更改),git会删除您的更改。由于源/是具有分离头的子模块(默认行为),git子模块更新将始终使源/目录处于父存储库所指示的状态。在我看来,这是git非常糟糕的行为,因为它甚至不会通知我本地更改被覆盖(git 1.7.7),如果更改未提交,
      子模块更新
      不会更改任何内容(至少在我的pc上是这样)。如果更改被提交,它们不会丢失,即使您签出了其他内容,也可以签出它们。此外,调用子模块更新的目的是什么?您仍然可以将cd刻录到源代码并进行签出。此外,若您将更改提交到源代码,则需要将它们推送到源代码。您应该将源视为简单的Git存储库,嵌套到PurrSrC中。它是什么