Git 从分支a切换到分支b会更改文件权限。但是,将*返回*到分支-a不会*恢复文件权限。为什么呢?

Git 从分支a切换到分支b会更改文件权限。但是,将*返回*到分支-a不会*恢复文件权限。为什么呢?,git,permissions,Git,Permissions,目前,在我的本地回购协议中,我签出了一个名为mybranch的分支,我的所有文件的权限为644()。工作目录中没有编辑,临时区域中没有任何内容。如果我签出master分支,两个文件的权限将更改为664()。如果我立即再次签出mybranch,则这些文件的权限不会变回644,而是保持在664。我有三个相关问题: 当我签出mybranch时,为什么权限不改回644?他们不应该吗 当我签出master分支时,为什么会发生权限更改?我认为Git只跟踪用户的执行权限 我如何正确地确保所有文件的权限保持在6

目前,在我的本地回购协议中,我签出了一个名为
mybranch
的分支,我的所有文件的权限为644()。工作目录中没有编辑,临时区域中没有任何内容。如果我签出
master
分支,两个文件的权限将更改为664()。如果我立即再次签出
mybranch
,则这些文件的权限不会变回644,而是保持在664。我有三个相关问题:

  • 当我签出mybranch时,为什么权限不改回644?他们不应该吗

  • 当我签出
    master
    分支时,为什么会发生权限更改?我认为Git只跟踪用户的执行权限

  • 我如何正确地确保所有文件的权限保持在644,而不考虑分支


  • 可能需要注意的几个事项:

    • 我在以特定Linux用户身份登录时创建了这个repo和主分支:
      user-a
      。当时,我想不起对这两个文件的权限。但他们很有可能是664人

    • 创建repo之后,我开始使用另一个Linux用户:
      user-b
      。我将整个repo迁移到计算机上的另一个目录,进入一个只有
      user-b
      才能访问的区域。以
      user-b
      身份登录时,正在完成我当前的所有工作

    • 我相信我在开始使用
      user-b
      之后创建了
      mybranch
      ,但我记不清了

    • 在另一篇论坛帖子中,有人提到所有权限都保存在repo级别的文件
      .git/index
      中。因此,恢复到
      master
      分支始终应用保存在该文件中的权限。那个人不知道如何查看该文件中设置的权限,并说我可以使用来更改该文件中的权限


    提前感谢。

    Git根本不存储组权限。1文件要么是
    模式100644
    ,这意味着它们是
    rw-
    ,要么是
    模式100755
    ,这意味着它们是
    rwx

    当用作Unix模式时,模式字符串
    100644
    100755
    分别表示
    rw-r--r--
    rwxr-xr-x
    。它们最初是Unix(或Linux)模式,但在很久以前,在除了Linus之外几乎没有人使用Git之前,它们已经不再是了

    相反,当Git自己创建文件时,它使用
    mode
    参数
    0666
    rw-rw-
    )或
    0777
    rwxrwx
    )。然后,根据您的个人umask设置,您的计算机操作系统会将这些模式位中的某些位切掉。此个人设置是每个进程的,通常是您在shell中操纵的

    默认的码片外位通常为
    ---w--w-
    ,即
    rwxrwx
    变为
    rwxr-xr-x
    。这是通过
    umask
    设置
    022
    实现的

    要让shell创建新进程,将chip-away位设置为
    ----w-
    ,请使用
    umask 002
    。(如果愿意,可以省略前导零;为了清晰起见,我希望保留它们。)

    664
    的更改似乎有些奇怪,但也许您在一个将umask设置为
    002
    的shell中执行此操作,并在一个将umask设置为默认
    022
    的shell中执行将
    644
    留给您的签出操作



    1在共享裸存储库的情况下,会应用某些组权限属性。但这并不是这里发生的事情。

    您提到,“对664的更改似乎很奇怪,但也许您在一个将umask设置为002的shell中这样做,并在将umask设置为默认022的shell中进行签出,从而使644保留在shell中。”我所做的所有更改都是签出一个不同的Git分支。如您所述,这可能会导致对shell进行更改吗?这似乎不太可能,但如果您打开了两个不同的shell窗口,可能这两个不同的shell窗口具有不同的umask设置。要查看当前设置,请运行shell内置的
    umask
    命令,该命令将打印当前值,而不是设置新值。现在,文件的权限设置为664,运行
    umask
    返回
    0002
    。无论我是在
    master
    分支还是
    mybranch
    ,情况都是如此。那么在这一点上,你会建议我如何解决这个问题?i、 e.如何确保这些文件的权限设置为644,并且无论分支如何,都保持在644?我可以简单地切换到
    主机
    ,然后将权限设置为644吗?我承认我甚至还没有尝试过。现在
    umask
    返回
    0002
    这一事实意味着Git或几乎任何其他程序现在真正创建的任何新文件都将具有模式
    664
    (不可执行)或
    775
    (可执行)。您可以随时在任何此类文件上使用
    chmod
    ;只有新文件才会设置为此模式。当您使用
    git checkout
    git switch
    从一个提交移动到另一个提交时,git将删除并重新创建两个提交中不同的任何文件,因此它们的权限将服从您当前的umask。如果您希望将来创建的文件具有模式
    664
    ,请立即将umask设置为
    022
    ,并找出是什么将其设置为
    002
    ,然后更改该设置。