Git extrae varios repositorys locales con script (ruby?)

Tengo ~ 30 repositorys git clonados de github que uso para el desarrollo web / ruby ​​/ javascript. ¿Es posible actualizar en bloque todas ellas con un script?

Tengo todo bastante organizado (estructura de carpetas):

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

Tengo un script de ruby ​​para clonar repositorys con octokit , pero ¿hay alguna sugerencia sobre cómo hacer git pull (sobreescritura / rebase local) en todos los repositorys en GitClones ?

Normalmente me gustaría tirar cada vez que estaba a punto de usar ese repository, pero voy a un lugar donde la conectividad a internet solo estará disponible algunas veces. Entonces me gustaría actualizar todo lo que pueda mientras tenga internet.

¡Gracias! (Ejecutando osx 10.8.2)

Si debe hacerlo en Ruby, aquí hay un script rápido y sucio:

 #!/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 

No olvides chmod + x el file en el que copys esto y asegúrate de que esté en tu directory de GitClones.

Claro, pero ¿por qué usar ruby ​​cuando el caparazón será suficiente?

 function update_all() { for dir in GitClones/*; do cd "$dir" && git pull done } 

Cambia el comienzo de glob al gusto. Esto hace dos cosas útiles:

  1. Solo git pull cuando contiene .git subdir
  2. Se salta los directorys de punto (.) Ya que nadie tiene repositorys de git que comienzan con un punto.

Disfrutar

 # 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 

Revisado al proveedor mejor resultado y ser agnóstico del sistema operativo. Este limpia los cambios locales y actualiza el código.

 #!/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