我们有3个人使用共享Git仓库。我们没有sudo权限来创建/更改组。由于机器是安全的,我们被要求使Git全局可写(chmod +R o+rw *
)。但是我们不时会收到这个错误。
error: insufficient permission for adding an object to repository database .git/ objects
这是随机发生的。当某人推送他的代码时,我不会收到此错误。当另一个人推送他的代码时,我再次收到此错误。
我已完成git repo-config core.sharedRepository true
,但似乎只适用于groups
。如何设置Git以使新文件全局可写?
答案 0 :(得分:13)
我们刚遇到同样的问题。除了跑步之外,这是我们解决它的方式
git repo-config core.sharedRepository true
。
注意:这是在Ubuntu Linux服务器上 - 您可能需要在操作系统上使用不同的命令,但方法应该大致相似。请注意,其中许多命令都需要以root用户身份运行,或者在sudo
下运行。
步骤1.创建新的共享组
例如,开发者。将开发人员添加到其中。
groupadd developers
usermod -aG developers <username>
步骤2.更改现有存储库的组所有权
chgrp -R developers /path/to/repo
同时使文件成群可写:
chmod -R g+w /path/to/repo
步骤3.确保在将组设置为新组名的情况下创建新目录
在某些* nix操作系统(例如FreeBSD,OS X)中,新创建的文件组继承自父目录。在其他操作系统(例如Ubuntu)上,它由创建过程的组确定。在后一种情况下,您可以通过在父目录上设置setgid标志来覆盖该行为。因此,有一种方法可以确保由例如新目录创建新目录。 git pull
与其父级具有相同的组,以便定期运行以下内容:
find /path/to/repo -type d -exec chmod g+s {} \;
(即找到类型目录下/ path / to / repo下的所有文件,并在它们上运行chmod g + s来设置setgid标志。)
您可能采用的另一种方法是将开发人员作为所有开发人员的主要登录组:
usermod -g developers <username>
(请注意,这可能导致用户不再是其先前主要登录组的成员,通常是与用户名同名的组。使用usermod -aG old_group usernanme
恢复该成员资格。)
使用usermod -g developers
意味着当用户创建新文件时,用户将默认拥有这些文件: username ,group:developers。但是,通常会创建新文件,以便它们只能是用户可写的,而不是组可写的。 (即,如果您运行touch foo; ls -l foo
,您将看到权限掩码为-rw-r--r--
。)要使您创建的新文件默认为可写组,请将umask 0002
添加到.profile
的末尾{1}}或.bash_profile
文件。
echo umask 0002 >> ~/.profile
唷!希望这可以帮助。我确信这个过程并不完美,它绝对不是一刀切,但希望它会给你一些指示。我已经把它变成了一个社区wiki,以便其他人可以添加它。
答案 1 :(得分:3)
这是一个丑陋的解决方案,但似乎有效。它基于post-receive钩子,用于在每次推送到存储库后为存储库中的所有文件设置权限。
mkdir sharedrepo
cd sharedrepo
git init --bare
echo "chmod -f -R a+rw ." >> hooks/post-receive
chmod a+x hooks/post-receive
cd ..
chmod -R a+rw sharedrepo
答案 2 :(得分:1)
将所有开发人员放入一个组(例如developers
),然后运行chgrp -R developers myrepo-on-the-server/
。