Git在推送时创建远程存储库

Mic*_*jen 26 git git-push git-config git-remote

我一直试图弄清楚这一点,但我很难这样做.我目前的工作,需要我允许用户一个开源项目到远程仓库没有它已经存在那里.我想避免手动登录到服务器并运行git initgit init --bare.

出于显而易见的原因,我在尝试将本地存储库推送到不指向远程服务器上的现有存储库的路径时收到以下错误:

fatal: '/var/repositories/myrepo' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
Run Code Online (Sandbox Code Playgroud)

但我希望能够运行以下命令:

git push origin master
Run Code Online (Sandbox Code Playgroud)

而且有创造/myrepo/var/repositories,如果它不存在.我怎么能做到这一点?我会假设它是某种(全局)git配置设置,你可能在远程服务器上设置,或者在本地设置(特定于存储库)git配置,但我无法弄明白.

任何帮助将非常感激!

谢谢!

Cas*_*bel 26

目前无法使用git push在远程上创建存储库.你能做的最好就是写一个单行脚本,如下所示:

#!/bin/bash
ssh $1 "git init --bare $2" &&
git push ssh://$1/$2
Run Code Online (Sandbox Code Playgroud)

希望你可以ssh; 如果你不能,你可以使用某种文件系统访问,只需通过转储到适当的文件/目录结构手动创建repo(可能在本地创建并复制).您也可以在此过程中创建一个命名远程.

这实际上是2010年Git调查中最受欢迎的功能之一- 所以也许你会在明年的某个时候得到你的愿望!


Pik*_*ass 8

您可以在远程编写包装器脚本,并将command ="/ path/to/wrapper"添加到authorized_keys的行.

command="/usr/local/bin/gitaccess" ssh-rsa ...
Run Code Online (Sandbox Code Playgroud)

在此包装器中,您将检查SSH_ORIGINAL_COMMAND.Git发出以下命令:

git receive-pack '/path/provided' # when pushing
git upload-pack '/path/provided' # when pulling
Run Code Online (Sandbox Code Playgroud)

如果SSH_ORIGINAL_COMMAND不为空并以其中一个开头,则检查路径,根据需要创建存储库,在其中安装所需的任何配置,然后执行命令.

如果SSH_ORIGINAL_COMMAND为空并且您希望为用户提供shell访问权限,则可以调用shell.

如果SSH_ORIGINAL_COMMAND不为空但不以git命令启动,如果要允许用户具有shell访问权限,则只需执行提供的命令即可.

这里有一些Ruby代码要演示.请注意,我没有测试它,还有改进的余地(例如我们不应该硬编码/ bin/bash).

#!/usr/bin/env ruby
orig_command = ENV['SSH_ORIGINAL_COMMAND']
if orig_command.nil?
    # If you want to preserve shell access
    exec '/bin/bash' # not tested, I hope it's interactive if executed this way
end

cmd_parts = orig_command.match /([a-z-]+) '([a-z0-9.\/]+)'/
if cmd_parts.nil?
    # If you want to preserve shell access
    exec '/bin/bash', '-c', orig_command
end

command = cmd_parts[1]
path = '/var/repositories/'+cmd_parts[2] # not secured (could contain '..')

if command == 'git-receive-pack' || command == 'git-upload-pack'
    if not File.directory?(path)
        `git init --bare #{path}` # not secured, I didn't escape path
        # Do any configuration here
    end
    exec 'git-shell', '-c', "#{command} '#{path}'"
end

# If you want to preserve shell access
exec '/bin/bash', '-c', orig_command
Run Code Online (Sandbox Code Playgroud)

您还可以在authorized_keys中将此参数传递给此脚本,以识别用户并选择是否应具有shell访问权限.我这样做也是为了控制每个存储库的访问.如果要将此参数传递给git钩子,只需创建一个环境变量.


Chr*_*ken 6

  1. 从远程登出并跟踪分支:

    git checkout -t origin/funbranch
    
    Run Code Online (Sandbox Code Playgroud)
  2. 分支:

    git checkout -b mybranch
    
    Run Code Online (Sandbox Code Playgroud)
  3. 推新的,它会在遥控器上自动创建一个新的分支:

    git push origin mybranch
    
    Run Code Online (Sandbox Code Playgroud)

它应该说"创建了新的远程分支origin\mybranch"

如果你还在"远程端挂起来",这听起来像是安全的东西.您是否正确安装了SSH密钥,并且您是否具有远程服务器的写入权限?

大多数开源项目的工作方式,你必须创建一个用来完成工作的fork(一个克隆本身),因为大多数时候你没有对repo的写权限.当您进行更改时,您将向存储库所有者发送拉取请求,并且他/她将从您的分支中提取他们想要的更改.

  • @Michael:你的评论听起来不像你的问题.在这里,您谈论的是将一个本地分支推送到另一个远程分支(可能存在也可能不存在).但是,您的问题是关于推送到*存储库*尚不存在的远程,并且必须创建. (5认同)