Когда я пытаюсь использовать драгоценный камень git
для нажатия, я получаю эту ошибку: src refspec master does not match any
. В моем репо используется main
вместо master
; но (при условии, что это проблема), я не вижу, как изменить восходящую ветвь.
Подробности:
Я пишу сценарий Ruby, который изменяет набор существующих, уже клонированных репозиториев и отправляет изменения. Я использую гем git
(https://github.com/ruby-git/ruby-git)
Вот минимальный пример:
git_dir = '.'
begin
$stderr.puts "Opening with git_dir: #{git_dir}"
g = Git.open("#{git_dir}", :raise => true)
g.config('remote.remote-name.push', 'refs/heads/main:refs/heads/main')
$stderr.puts "Current branch: #{g.current_branch}"
if g.status.changed.any?
g.add
g.commit('Updated grade report')
g.push(branch: g.current_branch)
else
$stderr.puts "No changes"
end
rescue Git::GitExecuteError => e
puts "Problem updating repo"
puts "error: #{e.message}"
end
Я запускаю эту программу после изменения файла в существующем, ранее клонированном репозитории git. Когда я это делаю, он терпит неудачу с этой ошибкой:
Problem updating repo
error: git '--git-dir=testGitRepo' '-c' 'core.quotePath=true' '-c' 'color.ui=false' push '{:branch=>"main"}' 'master' 2>&1:error: src refspec master does not match any
error: failed to push some refs to '{:branch=>"main"}'
Я подозреваю, что важной частью этого сообщения об ошибке является push '{:branch=>"main"}' 'master'
Тот факт, что master
все еще появляется, предполагает, что мне нужно сделать что-то еще, чтобы сообщить команде push
, что я хочу передать локальный main
в origin main
; но я не вижу, как это сделать.
Документы для push
говорят следующее:
pushes changes to a remote repository - easiest if this is a cloned repository, otherwise you may have to run something like this first to setup the push parameters:
@git.config('remote.remote-name.push', 'refs/heads/master:refs/heads/master')
Но я не понимаю, как вызвать config
так, чтобы восходящая ветвь стала основной. (Я попробовал g.config('remote.remote-name.push', 'refs/heads/main:refs/heads/main')
, и это не дало никакого эффекта. Конечно, я не совсем понимаю, что должна делать эта команда.)
push
принимает имена удаленного сервера и ветки как отдельные аргументы:
#push(remote = 'origin', branch = 'master', opts = {})
https://rubydoc.info/gems/git/Git/Base#push-instance_method
Использование следующего должно работать:
g.push('origin', 'main')
Фу. Я неправильно читал документацию. Каким-то образом мне пришло в голову, что
remote
иbranch
являются параметрами ключевого слова, а не позиционными.