GitHub不允许我访问子文件夹

GitHub不允许我访问子文件夹,git,zend-framework,version-control,github,git-submodules,Git,Zend Framework,Version Control,Github,Git Submodules,Short: GitHub已将我无法访问的repo中的文件夹灰显。这让我担心,因为我的代码更改就在那些文件夹中 长: 我正在开发一个ZF2 web应用程序,并使用git进行源代码控制。ZF2是模块化的,所以我在某个地方(很可能是composer.phar或git clone)下载了一些ZF2模块到项目子文件夹中。一个这样的ZF2模块是vendor/coolcsn/csn user。我对ZF2模块进行了更改 问题1:当我运行git status时,我得到以下结果: $ git status # O

Short:

GitHub已将我无法访问的repo中的文件夹灰显。这让我担心,因为我的代码更改就在那些文件夹中

长:

我正在开发一个ZF2 web应用程序,并使用git进行源代码控制。ZF2是模块化的,所以我在某个地方(很可能是composer.phar或git clone)下载了一些ZF2模块到项目子文件夹中。一个这样的ZF2模块是
vendor/coolcsn/csn user
。我对ZF2模块进行了更改

问题1:当我运行git status时,我得到以下结果:

$ git status
# On branch master
# Changes not staged for commit:
#       modified:   vendor/coolcsn/csn-user (modified content, untracked content)
当我运行gitcommit时,它说“提交时没有添加任何更改”。我确实做了一些改变

因此,我发现我可以将目录更改为
vendor/coolcsn/csn user
,并在那里执行git status和git commit。然后我可以更改回项目的根目录,并在那里执行git提交。那么,一切都好了。。。。直至:

问题2:直到我将git推送到GitHub。在GitHub上,我的整个项目似乎都准备好了,但是在GitHub上无法访问
供应商/coolcsn/csn用户
!它是灰色的。我不能点击它。它让我哭了。我不知道为什么,也不知道发生了什么事。我读过一些关于git子模块的内容。我不知道我是否有git子模块,或者它们是否是其他东西。我没有意识到自己设置了任何子模块。不管怎样,我担心我的GitHub子模块更改没有被跟踪,或者如果它们被跟踪,它们是隐藏的,无法查看

可能的解决方案#1:我想我可以删除子模块(如果它们是子模块)中的.git文件夹,然后直接提交到GitHub,我的
csn user
文件夹可能不会变灰。但在我这么做之前,我听说这是不可取的,我想检查一下到底发生了什么,以及如何正确使用git、GitHub和子模块,同时跟踪我的更改


特别是,寻找一组关于如何使用git和GitHub保持我的回购的可访问性和可提交性的步骤、说明或想法。

您似乎正在使用存储库中的子模块。运行
git submodule status
查看正在使用的子模块

“问题1”,即您对提交的混淆,是由于将更改提交到根存储库与提交到子模块存储库之间的差异造成的。听起来您正在提交子模块存储库,然后更新根存储库,使其子模块指向新提交。如果您没有发布这些提交,这可能会有问题,因为没有其他人能够找到它们,因此您应该签出根存储库并获取它所依赖的子模块

Github不会正确显示这些目录的内容,因为它们是对其他存储库中特定提交的引用,而不是根存储库本身的一部分


虽然您可以将所有这些文件检查到您的根存储库中,但这听起来确实很危险。这样做会破坏有关这些子文件夹内容来源的信息。没有任何其他人(包括将来的您)能够轻松识别这些内容来自何处,或者您从这些存储库中获取了哪个版本

如果您确实有子模块,并且运行git submodule status来检查它,请确保:

  • 不从本地Git存储库的子文件夹运行该命令
  • 或使用Git 2.25(2020年第1季度)
这是因为,在Git2.25(2020年第1季度)之前,从superproject的子目录运行的“
status
”没有很好地工作。这一点已经得到纠正

参见(2019年11月25日)作者 (于2019年12月5日合并)

:修复从子目录调用时的“子模块状态” 签字人:Manish Goregaokar

调用
[
git子模块
](https://git-scm.com/docs/git-submodule)状态
在子目录中时,我们没有正确地检测到修改过的子模块,因此报告所有子模块都没有更改

这是因为子模块帮助程序正在使用子模块路径调用
diff index
,假设该路径是相对于当前前缀目录的,但是使用的子模块路径实际上是相对于根目录的

在子模块上运行diff文件时,始终将
NULL
作为
前缀传递,以确保子模块的路径被解释为相对于超级项目的存储库根


“…如果您不发布这些提交,这可能会有问题”。确切地我正处于这种情况。我必须为我的特定业务需求编辑子模块,但我的更改没有存储在GitHub中。我该如何解决这个问题?我是否要分叉原始存储库,然后更新我的链接?此外,我已经广泛编辑了.gitmodules文件,并将我的所有子模块添加到其中。是的,如果您要提交子模块,您希望发布这些更改,不一定要公开,但至少要发布到任何构建项目的人都可以再次获取这些更改的地方(如果您需要切换到其他计算机,则包括您)。切换这些子模块以指向原始文件的分叉可能是最简单的解决方案。问题3:我有私有存储库,因此我无法将公共存储库分叉为私有回购的子模块。我需要按照此处进行复制:因此,在这种情况下,将我的子模块
csn user
作为m的子文件夹有什么不好y根回购?我将无法跟踪事物从何而来,但我将能够跟踪我自己对它所做的更改,并且我仍然会知道模块本身从何而来。我不确定我是否会处于adisadvantage。是否有更有力的理由将其保留为子模块?我正在考虑的情况是,如果对or进行了有用的更改,您会怎么做原始
csn用户
repo?一旦您将存储库从su中剥离