为什么GIT没有检测到文件模式644和664之间的差异?

时间:2015-12-31 12:31:03

标签: git

为什么GIT没有检测到文件模式644和664之间的区别,但它检测到755:

$:~/docker/images/php_cron/config$ ls -l crontab 
-rw-r--r--  1 saf  staff  4663 31 Dez 09:38 crontab

$:~/docker/images/php_cron/config$ chmod 664 crontab 
$:~/docker/images/php_cron/config$ ls -l crontab 
-rw-rw-r--  1 saf  staff  4663 31 Dez 09:38 crontab

$:~/docker/images/php_cron/config$ git status
On branch komplett-modularisiert
Your branch is up-to-date with 'origin/komplett-modularisiert'.

nothing to commit, working directory clean
$:~/docker/images/php_cron/config$ chmod 755 crontab 

$:~/docker/images/php_cron/config$ git status
On branch komplett-modularisiert
Your branch is up-to-date with 'origin/komplett-modularisiert'.



Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   crontab

no changes added to commit (use "git add" and/or "git commit -a")

我希望GIT检测到任何类型的文件模式更改。当我通过git部署我的文件时,我遇到了问题,他们的文件模式与我的存储库中的文件模式不同。

3 个答案:

答案 0 :(得分:11)

唯一的文件模式Git轨道位于“可执行”位。由于06440664都不意味着文件可以以任何方式执行,因此Git不会将其视为更改。

来自Git index format

  32-bit mode, split into (high to low bits)

    4-bit object type
      valid values in binary are 1000 (regular file), 1010 (symbolic link)
      and 1110 (gitlink)

    3-bit unused

    9-bit unix permission. Only 0755 and 0644 are valid for regular files.
    Symbolic links and gitlinks have value 0 in this field.

重要的部分是“只有0755和0644对普通文件有效。”所有其他文件权限都会重新解释为07550644,具体取决于0100位(u+x)是否已设置:来自cache.h

#define ce_permissions(mode) (((mode) & 0100) ? 0755 : 0644)

此宏用于将操作系统级文件权限映射到Git文件权限。

如果您需要跟踪存储库中的文件权限,则必须找到不同的方法。您可以尝试的一件事是在存储库中存储一个脚本,该脚本将所有文件权限重置为您指定的任何值。您可以在提交之前自动创建脚本(不是使用Git本身,而是使用您喜欢的任何其他语言或工具),并且可以在拉动后执行脚本。

答案 1 :(得分:1)

之前我遇到过这个问题,但没有解决方法。 唯一的方法是在将代码推送到服务器时保存权限。从服务器提取代码时恢复文件的权限。 我写了一个脚本来完成这项工作,你可以参考网址:sr-perm

答案 2 :(得分:-2)

这是告诉git跟踪模式更改的标志

git config core.fileMode true // or false

来自git-config(1)

core.fileMode
      If false, the executable bit differences between the index and the
      working copy are ignored; useful on broken filesystems like FAT.
      See git-update-index(1). 

    True by default.

umask

如果仍未跟踪您的更改,请使用以下命令:

umask 022

它将&#34;修复&#34; 此问题。

umask 002将设置具有组可写权限的新创建文件。

您可以将其添加到~/.profile,将其设置为默认的git beahavior

git(){(umask 0022; command git "$@")}