Пример git push с использованием Rugged или Grit

Мне нужны примеры кода для защищенного или зернистость, показывающая, как сделать git push.

Фон

У меня есть задачи rake deploy:staging и deploy:production, которые я использую для развертывания своего приложения.

Я развертываю на героку, поэтому эти задачи по существу делают следующее:

  1. Получить самый последний тег (например, git describe --abbrev=0)
  2. Отправьте версию, представленную этим тегом, на указанный пульт (например, git push staging v1.00)
  3. Сохраните версию в конфигурационной переменной heroku (например, heroku config:add APP_VERSION=v1.00)

(Там также есть некоторые проверки, чтобы убедиться, что я не забыл создать новый тег перед отправкой и т. д.)

Первоначально я использовал системные вызовы из моего Rakefile для этих команд CLI; затем я перешел к использованию git и heroku-api драгоценные камни.

Однако гем git, похоже, заброшен (за последний год никаких коммитов); кажется, что Grit и Rugged теперь являются стандартными жемчужинами для работы с Git.

К сожалению, из-за отсутствия документации я не могу понять, как сделать git push с любой из этих библиотек.

(В следующих примерах предположим, что удаленная/ветка, которую я отправляю, является источником/мастером и уже настроена как удаленная в локальном репо)

Начиная с прочного:

$ irb
2.0.0-p0 :001 > require 'rugged'
 => true 
2.0.0-p0 :002 > repo = Rugged::Repository.new('/path/to/repo')
 => #<Rugged::Repository:0x007fe8b48821c0 @encoding=#<Encoding:UTF-8>> 
2.0.0-p0 :003 > remote = Rugged::Remote.lookup(repo, 'origin')
 NoMethodError: undefined method `lookup' for Rugged::Remote:Class

Теперь о твердости:

$ irb
2.0.0-p0 :001 > require 'grit'
 => true 
2.0.0-p0 :002 > repo = Grit::Repo.new('/path/to/repo')
 => #<Grit::Repo "/path/to/repo/.git"> 
2.0.0-p0 :004 > remote = repo.remotes.last
 => #<Grit::Remote "origin/master"> 
2.0.0-p0 :005 > repo.git.push(remote)
NoMethodError: undefined method `delete' for #<Grit::Remote "origin/master">

Любая помощь будет принята с благодарностью.


person Scott    schedule 01.03.2013    source источник


Ответы (2)


Хорошо, я думаю, что понял это, НО теперь он запрашивает мои учетные данные gitHub, и я не могу ввести свои учетные данные, потому что получаю сообщение об ошибке «Тайм-аут».

Вот что я сделал:

Добавьте удаленное репо в проект:

repo.git.remote({},'add','RemoteRepoName','https://github.com/ /.git')

Отправить на гитхаб

pusher = repo.git.push({:process_info => true, :progress => true}, 'RemoteRepoName', 'master')

person mcKain    schedule 10.04.2013
comment
Спасибо, МакКейн... кажется, это работает. Я получил ошибку при попытке нажать из локального репо в другое репо на той же машине, но это было только потому, что удаленный репозиторий не был голым репозиторием; поэтому в случае перехода на github или heroku я не думаю, что это будет проблемой. В случае отправки на github вам, вероятно, потребуется добавить удаленный сервер, используя URL-адрес SSH (например, [email protected]:username/repo), а не URL-адрес https. В любом случае, этого достаточно, чтобы отметить это как ответ. Спасибо. - person Scott; 11.04.2013

С упорством repo.git.push фактически обращается к Git#native через method_missing. Его подпись такова:

def native(cmd, options = {}, *args, &block)

поэтому вместо этого вы хотите сделать следующее:

repo.git.push({}, remote)

Да, глупо ставить ДОПОЛНИТЕЛЬНЫЕ опции в начале, но так написано.

person Cody    schedule 09.04.2013
comment
Спасибо Коди. Не уверен, что я делаю что-то не так, но, похоже, это не сработало. Я могу вызвать repo.git.push({}, remote), как вы предлагаете, и хотя он больше не выдает ошибку, на самом деле он ничего не передает на пульт. - person Scott; 10.04.2013