当我使用终端在OSX上下载文件时,默认情况下我没有编辑权限 我怎么能改变它?
kirkstrobeck:atheycreek kirkstrobeck$ ls -lad ~ . .git
drwxrwxrwx 8 kirkstrobeck staff 272 May 24 18:20 .
drwxrwxrwx 16 kirkstrobeck staff 544 May 25 10:58 .git
drwxr-xr-x+ 92 kirkstrobeck staff 3128 May 24 15:17 /Users/kirkstrobeck
kirkstrobeck:~ kirkstrobeck$ umask
0022
kirkstrobeck:atheycreek kirkstrobeck$ ls -l
total 8
-rwxrwxrwx 1 kirkstrobeck staff 2143 Mar 6 14:49 README.md
drwxrwxrwx 4 kirkstrobeck staff 136 May 23 14:45 www
kirkstrobeck:atheycreek kirkstrobeck$
注意:我在用CHMOD修复问题后运行了这些终端命令,但我每次都这样做,因为它会降低错误的权限。
答案 0 :(得分:6)
当您说您没有编辑权限时 - 您究竟是什么意思?
注意:在使用CHMOD修复问题后,我运行了这些终端命令
这意味着输出没有帮助。所有这些权限都显示:
kirkstrobeck:atheycreek kirkstrobeck$ ls -lad ~ . .git
drwxrwxrwx 8 kirkstrobeck staff 272 May 24 18:20 .
drwxrwxrwx 16 kirkstrobeck staff 544 May 25 10:58 .git
drwxr-xr-x+ 92 kirkstrobeck staff 3128 May 24 15:17 /Users/kirkstrobeck
是你做对列出的所有内容都有编辑权限 - 如果您之前在该文件夹上运行过chmod -R 777 .
,则可以预期。
更相关的权限是您尝试编辑的内容的文件和文件夹的权限。使用命令的一个特定示例,它生成的错误和相关文件的权限 - 将成为一个特定的答案,如果没有,一些有根据的猜测工作:
Git根本不存储文件夹,只存储文件的可执行权限。你可以用这样的东西证明这一点:
[andy@work:/tmp/so/original]$ git init
[andy@work:/tmp/so/original]$ touch 0700
[andy@work:/tmp/so/original]$ touch 0600
[andy@work:/tmp/so/original]$ touch 0500
[andy@work:/tmp/so/original]$ touch 0400
[andy@work:/tmp/so/original]$ chmod 0700 0700
[andy@work:/tmp/so/original]$ chmod 0600 0600
[andy@work:/tmp/so/original]$ chmod 0500 0500
[andy@work:/tmp/so/original]$ chmod 0400 0400
[andy@work:/tmp/so/original]$ git add *
[andy@work:/tmp/so/original]$ git commit -va
[master (root-commit) a304e1b] adding files with the named permissions
0 files changed
create mode 100644 0400
create mode 100755 0500
create mode 100644 0600
create mode 100755 0700
[andy@work:/tmp/so/original(master)]$ ls -la
total 12
drwxr-xr-x 3 andy users 4096 May 28 14:51 .
drwxr-xr-x 3 andy users 4096 May 28 14:48 ..
-r-------- 1 andy users 0 May 28 14:48 0400
-r-x------ 1 andy users 0 May 28 14:48 0500
-rw------- 1 andy users 0 May 28 14:48 0600
-rwx------ 1 andy users 0 May 28 14:48 0700
drwxr-xr-x 8 andy users 4096 May 28 14:51 .git
以上显示(带有ls -la
)文件权限,表示为数字(文件名)和读取,写入,可执行文件(左侧)。只有两个文件0500和0700具有可执行权限。
[andy@work:/tmp/so/checkout]$ git init
Initialized empty Git repository in /tmp/so/checkout/.git/
[andy@work:/tmp/so/checkout]$ git pull ../original/
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../original
* branch HEAD -> FETCH_HEAD
[andy@work:/tmp/so/checkout(master)]$ ls -la
total 12
drwxr-xr-x 3 andy users 4096 May 28 14:52 .
drwxr-xr-x 4 andy users 4096 May 28 14:52 ..
-rw-r--r-- 1 andy users 0 May 28 14:52 0400
-rwxr-xr-x 1 andy users 0 May 28 14:52 0500
-rw-r--r-- 1 andy users 0 May 28 14:52 0600
-rwxr-xr-x 1 andy users 0 May 28 14:52 0700
drwxr-xr-x 8 andy users 4096 May 28 14:52 .git
[andy@work:/tmp/so/checkout(master)]$
以上表明结帐具有默认文件权限(由umask
指定的权限),如果提交为可执行文件,则添加可执行文件。
了解上述内容可以帮助您专注于真正的问题所在。
如果您的结帐权限错误,您可以使用以下命令修复它们:
# make sure all files are owned by you
sudo chmod -R andy:users .
# reset to default permissions
sudo find . -type d -exec chmod 0755 {} \; -or -type f -exec chmod 0644 {} \;
仔细检查您在任何错误消息中提到的文件;该文件的权限现在为0644,它所在的文件夹为0755。
更正文件权限后,您应该好好去。
请注意您需要文件夹 的可执行权限才能查找和操作内容。如果你没有文件夹上的可执行文件权限,你将获得权限错误,几乎可以在其中执行任何操作。 但是,再次,git根本不存储文件夹,如果这就是问题,那就不是git相关的。
如果对您的仓库进行了任何更改,您可以使用以下内容进行更改:
git commit -am "Resetting file permissions to their default values"
这只是提交对文件的可执行属性的更改,并且只是一个清理步骤 - 不修复任何会导致许可问题的其他人签出回购。
如果您希望结帐完全忽略您应用于结帐的权限,则可以使用:
git config core.fileMode false
通过这种方式,git不会将您应用于结帐的文件权限更改视为提交更改 - 但鉴于可用信息,这可能不太相关。
答案 1 :(得分:2)
git
根据您的umask
设置运行。 git操作的唯一工作目录权限是执行位。如果您无法撰写,则必须使umask
设置非常严格,例如,0277
会为您自己删除w
,为{+ 1}删除rwx
。
尝试运行umask
以查看您当前设置的内容,并umask 022
设置典型设置(022
=带走w
以获取群组和其他设置
答案 2 :(得分:1)
尝试检查 core.sharedRepository 这可以设置,因此umask不是权限的默认值:
来自git-config(1):
当group(或true)时,存储库可以在组中的多个用户之间共享(确保所有文件和对象都是可写组的)。当所有(或世界或所有人),所有用户都可以读取存储库,此外还可以进行组共享。当umask(或false)时,git将使用umask(2)报告的权限。当0xxx,其中0xxx是八进制数时,存储库中的文件将具有此模式值。 0xxx将覆盖用户的umask值(而其他选项将仅覆盖用户的umask值的请求部分)。示例:0660将使所有者和组可以读取/写入,但是其他人无法访问(除非umask是例如0022,否则相当于组)。 0640是一个可读组但不可写组的存储库。请参阅git-init(1)。默认为假。
所以
git config core.sharedRepository all
转而让每个人都可以访问。