Git тянет несколько локальных репозиториев с помощью скрипта (ruby?)

У меня есть ~30 git-репозиториев, клонированных из github, которые я использую для разработки web/ruby/javascript. Можно ли массово обновить их все с помощью скрипта?

У меня все довольно организовано (структура папок):

- Workspace
  - Android
  - Chrome
  - GitClones
    - Bootstrap
    ~ etc...30 some repositories
  - iPhone
  - osx
  - WebDev

У меня есть ruby-скрипт для клонирования репозиториев с octokit, но есть ли какие-либо предложения о том, как сделать git pull (перезапись/перебазирование локального) во всех репозиториях под GitClones?

Обычно я просто делал пул всякий раз, когда собирался использовать этот репозиторий, но я собираюсь в место, где подключение к Интернету будет доступно только иногда. Так что я хотел бы обновить все, что я могу, пока у меня есть интернет.

Спасибо! (работает OSX 10.8.2)


person AtHeartEngineer    schedule 26.11.2012    source источник


Ответы (4)


Если вам нужно сделать это на Ruby, вот быстрый и грязный скрипт:

#!/usr/bin/env ruby

Dir.entries('./').select do |entry|
  next if %w{. .. ,,}.include? entry
  if File.directory? File.join('./', entry)
    cmd = "cd #{entry} && git pull"
    `#{cmd}`
  end
end

Не забудьте chmod +x файл, в который вы копируете, и убедитесь, что он находится в вашем каталоге GitClones.

person jboursiquot    schedule 26.11.2012
comment
Потрясающий! Спасибо, снова выручил stackoverflow! - person AtHeartEngineer; 28.11.2012

Конечно, но зачем использовать ruby, если достаточно оболочки?

function update_all() {
  for dir in GitClones/*; do 
    cd "$dir" && git pull
  done
}
person pje    schedule 26.11.2012
comment
Я полюбил рубин и решил, что если большинство моих сценариев будет написано на рубине, то я мог бы и придерживаться его. Но оболочка работает! Спасибо! - person AtHeartEngineer; 28.11.2012

Измените начало шарика по вкусу. Это делает две полезные вещи:

  1. Это только git pull, когда он содержит .git subdir
  2. Он пропускает каталоги с точками (.), поскольку ни у кого нет репозиториев git, начинающихся с точки.

Наслаждаться

# Assumes run from Workspace
Dir['GitClones/[^.]*'].select {|e| File.directory? e }.each do |e|
  Dir.chdir(e) { `git pull` } if File.exist? File.join(e, '.git')
end
person Thomas Enebo    schedule 26.11.2012

Пересмотрено для лучшего вывода провайдера и независимости от ОС. Этот очищает локальные изменения и обновляет код.

#!/usr/bin/env ruby

require 'pp'

# no stdout buffering
STDOUT.sync = true

# checks for windows/unix for chaining commands
OS_COMMAND_CHAIN = RUBY_PLATFORM =~ /mswin|mingw|cygwin/ ? "&" : ";"

Dir.entries('.').select do |entry|
  next if %w{. .. ,,}.include? entry
  if File.directory? File.join('.', entry)
    if File.directory? File.join('.', entry, '.git')
      full_path = "#{Dir.pwd}/#{entry}"
      git_dir = "--git-dir=#{full_path}/.git --work-tree=#{full_path}"
      puts "\nUPDATING '#{full_path}' \n\n"
      puts `git #{git_dir} clean -f #{OS_COMMAND_CHAIN} git #{git_dir} checkout . #{OS_COMMAND_CHAIN} git #{git_dir} pull` 
    end
  end
end
person Haris Krajina    schedule 28.02.2014