当它在标准输出上说“创建模式......”时,“git commit”是啥意思?

Posted

技术标签:

【中文标题】当它在标准输出上说“创建模式......”时,“git commit”是啥意思?【英文标题】:What does 'git commit' mean when it says 'create mode ...' on stdout?当它在标准输出上说“创建模式......”时,“git commit”是什么意思? 【发布时间】:2012-01-21 06:11:32 【问题描述】:

编辑:

请参阅Danny Lin's git-store-meta 作为以下描述的版本控制元数据问题的建议解决方案。截至 2015 年 5 月 13 日,我还没有对其进行测试。

原始问题:

git commit 输出中的create|delete mode ... 行(下面的示例)是否代表某种元数据控制? (和/或,这些行一般代表什么?)这些似乎是类 unix 的文件权限代码/表示,虽然我不确定 - 究竟 - 映射,但更大的问题是:如果有的话怎么办git do 使用这些代码/设置/值? git 是否尝试以任何方式利用这些保存的代码来证明有助于解决我的每个 superuser.com 问题"How to reuse/extend etckeeper's metadata engine for git control of non-/etc filesystems, or extend git natively with said capability?" 的元数据问题?我知道 git 不会控制所有文件系统元数据。

[Git 显然已经控制了文件的“可执行属性/权限”(对于大多数操作系统来说显然是可移植的)和其他一些东西,比如文件系统链接。我正在为更多/所有元数据(即所有权限和用户/组所有权)寻求更多 Unix/Linux/BSD/DarwinMacOSX 特定的控制机制。 ACL 和其他元数据控制可选。尝试查看 git is 当前存储的内容是否有助于解决此问题。]

root@node1 Dec 15 09:40:45 ~/.../sandbox-1# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#   new file:   dummy-file-will-be-removed
#   deleted:    ownerfile
#
root@node1 Dec 15 09:40:45 ~/.../sandbox-1# git commit -m "testing git"
[master c5b0201] testing git
 2 files changed, 1 insertions(+), 2 deletions(-)
 create mode 100644 dummy-file-will-be-removed
 delete mode 100644 ownerfile
root@node1 Dec 15 09:41:55 ~/.../sandbox-1# 
[...]
root@node1 Dec 15 11:33:11 ~# git --version
git version 1.7.4.1
root@node1 Dec 15 11:33:14 ~# 

【问题讨论】:

Modelast three number 是不同用户组的file permissions。而first three 是关于file type,对此不是很清楚。你可以试着这样想:创建一个名为dummy-file-will-be-removed 的文件,其mode is 100644。 ;) 【参考方案1】:

有关 Git 模式的更多信息,请参阅this answer。

Git 存储文件元数据的能力仅限于一个简单的信息子集,以允许 Git 跟踪一些基本的文件系统更改,从而允许 Git 跟踪源代码管理的相关更改;比如文件是否被修改过,文件是普通文件还是可执行文件。

Git 不会尝试实现文件系统的任何概念,而是将文件系统例程留给实际的文件系统实现。无论是在 Linux、MacOS、Windows 等上运行的 FAT32、NTFS、EXT3、XFS、NFS 等文件系统上,这对于让 Git 都能同样工作是很有意义的。

【讨论】:

+1 this answer,谢谢。 fwiw,我正在尝试通过 optional 以潜在的操作系统/文件系统特定方式控制元数据来扩展 git 功能。对于许多/大多数 POSIX/unix/linx/MacOS 文件系统中常见的基础知识,如果没有良好的文件元数据控制,正确的自动化系统部署会令人头疼。 (阅读:我不会在 Windows 上自动部署。)更多详细信息请访问我的question here。 编辑原始问题以解决上述问题。唉,根据上述答案,现在(大概)发现了 git 的index-format.txt 的限制,即pretty limited。但是,所述答案确实描述了一个组可写文件,这是新消息,并且很有用......假设它有效。 @JohnnyUtahh 你的SuperUser question 是一个很好的研究问题;我会感兴趣的解决方案。我不知道有任何 Git 工具或扩展允许文件元数据的版本控制。 谢谢。用几个查询几乎用尽了这个(git 元数据)域。等待查看this conversation 是否有任何新的努力/项目出现。 @'Dan Cruz' 查看Danny Lin's proposed new tool 以解决版本控制元数据问题。我还没有测试它。【参考方案2】:

这些是文件权限,作为 unix 风格的权限值。它们以八进制打印,表示用于读取、写入和执行的 3 位集群。如果您查看 git 中的树对象(例如:git ls-tree HEAD),您可以看到 git 记录的有关目录内容的所有内容。也就是说,树包含具有权限位的树和 blob

C:\project>git ls-tree HEAD
100644 blob 66f3f25c8ca9ae73b99669aca6ba5ecfa4703b2b    .gitignore
100644 blob 60b88ac20b8b7cccdcd856e65415a9eb9495b63a    Makefile
040000 tree e1d9381e4d12effea7e33f8d7e2b16e372f67b51    demos
100644 blob a60e08eeb9f75160ae2bf6a9feeff3c1c75bfc1d    doxygen.cfg

6 表示可读写,4 表示只读。

【讨论】:

应该值得一提的是,这个644不一定一定是给定文件的实际unix权限:具有664600权限的文件将存储在git as 644 ——并不是你错了。我刚刚尝试在 Linux 上使用 git 1.8.0.1,实际上我添加的 0600 文件在 git 树中显示为 0644。这可能是一个错误,也可能是设计使然。【参考方案3】:

不,git 不存储完整的元数据。它只存储文件的类型(并且仅限于常规文件文件、目录和符号链接)以及文件是否可执行(当然,默认情况下是哪些目录)。

【讨论】:

以上是关于当它在标准输出上说“创建模式......”时,“git commit”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

当它弹出时移动小吃栏下方的标签,当它在javascript中消失时将它们移回

当它在 而不是 [] 中时,我如何从 api 中获取东西

负数的输出总是-3

当且仅当它在 React Native 中返回 null 时,如何使函数再次运行?

添加 www 的 htaccess 条件。仅当它在 url 中不包含字符串时才到 url

在管道中强制标准输出的行缓冲