Git / Gitolite一些文件夹为空,权限问题?

3

我正在使用git,但是以集中式方式。我有一个服务器托管一个仓库,我们在该仓库上进行拉取/推送操作。当在另一台机器上克隆/拉取该仓库时,我注意到其中几个文件夹是空的(当我得到一台新电脑并将该仓库克隆到它时,我才注意到这一点)。我查看了gitolite Web界面,并发现这些文件夹的权限为“m---------”,而其他文件夹则为drwxr-xr-x。我不确定它是如何变成这样的...... 我尝试了一些方法,但无法解决。


“m-------”?但我在http://en.wikipedia.org/wiki/Filesystem_permissions中没有看到任何“m”。 - VonC
我也不知道,这是在gitolite网络界面上,所以我不知道那是什么意思。 - Eric Seifert
只是为了确认一下,你说的是 gitweb 吗?(因为我不知道有“gitolite”的Web接口) - VonC
1个回答

2

这可以通过查看gitweb源码进行解释:

# convert file mode in octal to symbolic file mode string
sub mode_str {
  my $mode = oct shift;

  if (S_ISGITLINK($mode)) {
    return 'm---------';
  } elsif (S_ISDIR($mode & S_IFMT)) {
    return 'drwxr-xr-x';
  } elsif (S_ISLNK($mode)) {
    return 'lrwxrwxrwx';
  } elsif (S_ISREG($mode)) {
    # git cares only about the executable bit
    if ($mode & S_IXUSR) {
      return '-rwxr-xr-x';
    } else {
      return '-rw-r--r--';
    };
  } else {
    return '----------';
  }
}

通过S_IFGITLINK => 0160000,可以创建一个特殊模式的子模块

自从2007年和此补丁之后,gitweb中会显示子模块条目:

目前,在超级模块(当前仓库)中只有指向子模块条目历史记录的链接,因为gitweb不知道在哪里搜索子模块存储库对象。

因此,它们并不是空目录,而是子模块的根目录。

请参见 "Git-轻松拉取所有子模块的最新版本" 获取更多信息。


我认为这是正确的方向。我的唯一问题是,为什么它们被认为是“子模块”。该存储库由许多文件夹组成,每个文件夹中都有各种脚本。没有一个被认为是子模块,所以也许我设置了错误的东西? - Eric Seifert
也许我正在回答自己的问题,但是,如果git检测到文件夹已经是另一个git仓库的一部分,那么它是否是“子模块”?在此之前,我确实将其中一些脚本作为单独的git仓库,并将它们合并到一个仓库中。在此过程中,一些现有的git文件夹由于疏忽没有被删除。 - Eric Seifert
请注意,只有一个 .git 意味着一个嵌套的仓库,这基本上被父仓库忽略了(https://dev59.com/CnNA5IYBdhLWcg3wjOlS#918927)。子模块是一个嵌套的仓库,在索引中有一个特殊的条目(https://dev59.com/LkzSa4cB1Zd3GeqPjhcN#2300638),并且在 .gitmodules 文件中声明。如果您真的想要完全合并两个仓库,您需要一个子树合并策略(https://dev59.com/YHNA5IYBdhLWcg3wmfEa#899428):http://git-scm.com/book/en/Git-Tools-Subtree-Merging - VonC
@EricSeifert 当然,子模块本身就是一个Git仓库:https://dev59.com/mXI-5IYBdhLWcg3wMFMf#1979194 - VonC
谢谢,我使用 git rm 命令删除了文件夹,然后重新添加并提交了。我知道我失去了提交历史记录,但对于出现问题的这两个文件夹来说并不重要。 - Eric Seifert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接