我是一个试图开始编写项目代码的小团队的一员。我已经决定是时候给git一个机会了(不再是svn)并试图看看我们是否可以使用我们的共享虚拟主机在那里部署一个“公共”存储库,以便我们可以轻松地推送/拉出它和及时了解彼此的变化。
我现在遇到的问题是我们只有一个ssh帐户用于托管。在过去使用过svn之后,我可以在给定的一对ssh键上强制执行svn用户名,但是我似乎无法用git做类似的事情(换句话说,将ssh keypair绑定到特定的dev)。我不介意每个人都有读/写权限,因为任何私有都应该留在彼此的机器上。最后,不能使用诸如gitosis的解决方案。
我想我的问题是如何给予git推送的责任?它是否与正在使用的ssh帐户或git config中给出的电子邮件地址相关联?我可以为每个开发人员创建不同的ssh密钥(对于相同的ssh帐户),然后将它们发送给开发人员吗?
答案 0 :(得分:8)
通常你有一个git用户,每个人都使用它来提交,并且他们在服务器上有ssh密钥,这样你就可以登录。我使用gitolite来管理我的git存储库。但是,您只需使用ssh访问即可。
登录您的webhost为您的项目创建一个文件夹。然后让您的开发人员创建rsa公钥,将它们复制到您的webhost的主文件夹中。将它们复制到〜/ .ssh / authorized_keys中。现在,您的所有开发人员都能够进入该计算机。现在你让他们做git pull webhostUsername @ somehost:project.git
设置空目录的示例:
ssh user@host.com
mkdir someProject.git
cd someProject.git
git init --bare
cd ~
git clone user@host:someProject.git test
cd test
touch README
git add README
git commit -m "added readme"
git push
将开发者添加到该帐户
scp someuser_id.pub user@host.com:
ssh user@host.com
cat someuser_if.pub >> ~/.ssh/authorized_keys
现在,创建该公钥的人将能够连接到您的服务器。
每个使用git的人都必须提供用户名和电子邮件。这就是你如何跟踪谁在使用它。您用来推送的用户只能进行通信。
答案 1 :(得分:5)
我们遇到了类似的问题:一台带有git克隆仓库的服务器和一台用于使用SSH密钥连接的开发人员。我们的问题是我们需要从这个服务器推送到Github的确切提交者。
可能在登录时从git config
运行的 .bascrc
无效,因为这会在SSH中启用用户设置的设置(user.name
和user.email
)目录,因此对所有开发者连接。因此,建立连接的最后一个会覆盖另一个dev刚刚设置的设置。
我发现这篇文章您可能还需要Carrying your Git settings around。这是关于设置变量:
GIT_AUTHOR_NAME="Developer Name"
GIT_AUTHOR_EMAIL=foo@example.org
GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
在开发人员计算机上,让SSH将它们转发到服务器,如尖头文章所述。
但无论如何,开发人员必须受到信任,因为他们总是可以欺骗这些设置。
答案 2 :(得分:1)
简短的回答是让每个开发人员在提交任何内容之前在他们的开发机器上运行以下两个命令:
git config --global user.name "Example Name"
git config --global user.email "example@email.address.com"
您可以查看当前的设置:
git config --list
这些设置将根据开发人员进行的每次提交进行记录,并在列出日志等时可以看到。请记住,使用git,更改会在推送到您的公共仓库之前先在本地记录。连接到公共仓库进行推送的方法(ssh,git://或本地)与提交没有关系。
可以使用环境变量覆盖全局设置(有关详细信息,请参阅git-commit-tree man page),但如果上面列出的环境变量或全局设置都不存在,git将使用针对用于制作的系统帐户记录的设置commit(用户名和主机名。)
答案 3 :(得分:0)
使用Gitosis
,您基本上可以设置一个接受多个SSH密钥的shell帐户。每个开发人员都有自己的密钥,每个开发人员的提交都会正确归因于密钥所有者,而不是shell帐户所有者。
答案 4 :(得分:-1)
就像更新一样,我最后使用自定义gitserve脚本执行上述操作,我发现它已经在某处(抱歉没有链接了):
#!/usr/bin/env ruby
# user and permissions are passed from authorized_keys
user = ARGV[0]
permissions = ARGV[1]
command = ENV['SSH_ORIGINAL_COMMAND']
abort unless user and permissions and command
# check the supplied command contains a valid git action
valid_actions = ['git-receive-pack', 'git-upload-pack']
action = command.split[0]
abort unless valid_actions.include? action
# check the permissions for this user
abort "read denied for #{user}" unless permissions =~ /r/
abort "write denied for #{user}" if action == 'git-receive-pack' and permissions !~ /w/
STDERR.write "user #{user} authorized\n"
# user made a valid request so handing over to git-shell
Kernel.exec 'git', 'shell', '-c', command
我的.authorized_keys文件包含以下开头的条目:
command="/path/to/custom/script <username> <permissions>",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa ...
其中permissions = r,w或rw。谢谢大家的意见!
答案 5 :(得分:-2)
尝试一种免费的托管解决方案,与您的服务器托管相比,它可以提供许多优势。优势包括高级合并请求工作流程,具有各种功能的基于Web的代码浏览器等。
您可以查看Assembla - http://www.assembla.com。他们只是为Git发布了一个非常有用的高级合并请求工作流程:http://blog.assembla.com/assemblablog/tabid/12618/bid/80158/Announcing-Advanced-Merge-Requests-for-Git.aspx