问题描述
|
我们有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使新文件可全局写入?
解决方法
我们只是遇到了同样的问题。除了跑步之外,这是我们的解决方法
git repo-config core.sharedRepository true
。
注意:这是在Ubuntu Linux服务器上-您的操作系统上可能需要不同的命令,但是方法应该大致相似。请注意,其中许多命令将需要以root用户或在ѭ5下运行。
步骤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
恢复该成员。)
使用“ 13”表示当用户创建新文件时,默认情况下,它们将由user:username,group:developers拥有。但是,通常会创建新文件,以便它们只能由用户写入,而不能由组写入。 (即,如果您运行touch foo; ls -l foo
,您会看到权限掩码为-rw-r--r--
。)要使您创建的新文件默认为可组写入,请在.profile
或.bash_profile
文件的末尾添加umask 0002
。
echo umask 0002 >> ~/.profile
!希望这可以帮助。我确定此过程并不完美,而且绝对不是万能的,但希望它能为您提供一些指导。我已将其设置为社区Wiki,以便其他人可以添加到它。
, 这是一个丑陋的解决方案,但似乎可行。它基于接收后挂钩,该挂钩用于在每次推送到存储库后为存储库中的所有文件设置权限。
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
, 将所有开发人员归为一组(例如developers
),然后运行chgrp -R developers myrepo-on-the-server/
。