当你说你没有编辑权限时——你到底是什么意思?
注意:我在使用 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 问题
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)]$
以上表明 checkout 具有默认文件权限(由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无关。
如果这对您的 repo 进行了任何更改,您可以提交它们:
git commit -am "Resetting file permissions to their default values"
这只会提交对文件的可执行属性的更改,并且只是一个清理步骤 - 不会修复任何会导致其他人检查 repo 的权限问题。
忽略文件权限
如果您希望您的结帐完全忽略您应用于结帐的权限,您可以使用:
git config core.fileMode false
通过这种方式,git 不会将您应用于结帐的文件权限更改视为提交更改 - 但鉴于可用信息,这不太可能相关。