У меня есть ~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)
Ответ 1 · рейтинг 6 · jboursiquot
Если вам нужно сделать это на 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.
Ответ 2 · рейтинг 4 · pje
Конечно, но зачем использовать ruby, если достаточно оболочки?
function update_all() {
for dir in GitClones/*; do
cd "$dir" && git pull
done
}
Ответ 3 · рейтинг 1 · Thomas Enebo
Измените начало шарика по вкусу. Это делает две полезные вещи:
- Это только git pull, когда он содержит .git subdir
- Он пропускает каталоги с точками (.), поскольку ни у кого нет репозиториев 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
Ответ 4 · Haris Krajina
Пересмотрено для лучшего вывода провайдера и независимости от ОС. Этот очищает локальные изменения и обновляет код.
#!/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