1

以前のスタックオーバーフローに関連する

リポジトリを作成する Ruby スクリプトを実行して、承認されたキーの前にプレフィックスを付ける手順に従いました。スクリプトはリポジトリを正常に作成しますが、コードの git-receive-pack 送信は正しくアンロードできません。リポジトリは、プッシュを行っている同じユーザーによって所有されています。

fatal: ''/path/to/my/repo'' does not appear to be a git repository

また、別の症状として、ssh セッションがコマンド プレフィックス付きで自動的に閉じます。コマンドを削除するとすぐに、問題なくプッシュされます。

私たちのビルド システムでは、これは便利な機能なので、動作に関する洞察を探しています。

たとえばスクリプト

require 'git'
require 'fileutils'
require 'mixlib/shellout'

var = ENV['SSH_ORIGINAL_COMMAND']

def process_request(var)
  path = var.split[1].gsub("'", '')
  unless File.exist?(path)
    FileUtils.mkdir_p(File.dirname(path))
    Git.init(path, bare: true)
  end
  command = Mixlib::ShellOut.new(var)
  command.run_command
end

process_request(var) if var.to_s.include?('git-receive-pack')
4

1 に答える 1

0

私の問題は、通常の操作を再開するためにシェルを呼び出す方法にありました。私のニーズをよりよく満たすために、元の投稿からスクリプトを変更しました。

require 'fileutils'
require 'logger'
require 'git'

LOG         = Logger.new('/path/to/gitlog/create_on_push.log')
SSH_COMMAND = ENV['SSH_ORIGINAL_COMMAND']
USER_SHELL = '/bin/sh'
PATH_PREFIX = '/path/to/gitdir'
#########################################################################
# create missing path and repo
#
# @param path [string] path to the repository to create
#
def initialize_repo(repo_path)
  path = File.join(PATH_PREFIX,repo_path)
  unless File.exist?(path)
    LOG.info("initializing repository #{path}")
    FileUtils.mkdir_p(File.dirname(path))
    Git.init(path, bare: true)
  end
end

#########################################################################
# run ssh command if no arguments
#
def noargs
  LOG.info('running shell with no arguments')
  exec USER_SHELL
end

#########################################################################
# run supplied ssh command
#
def shell_with_command
  LOG.info("shell with command \"#{SSH_COMMAND}\"")
  exec USER_SHELL, '-c', SSH_COMMAND
end

#########################################################################
# initialize repo and allow for push of content to repo
#
# @param command [string] command to run
# @param path [string] path to the git repo
#
def git_shell_args(command, path)
  repo_path = path.gsub('\'','')
  initialize_repo(repo_path)
  exec 'git-shell', '-c', "#{command} '#{repo_path}'"
end

# default action if no ssh commands were supplied
noargs if SSH_COMMAND.nil?

# words is empty or have 2 words
command, path = SSH_COMMAND.split(' ')
case command
when 'git-receive-pack'
  git_shell_args(command, path)
when 'git-upload-pack'
  git_shell_args(command, path)
else
  shell_with_command
end
于 2018-06-22T18:51:07.953 に答える