2012-11-26 56 views
1

我從github克隆了30個git存儲庫,用於web/ruby​​/javascript開發。是否可以批量更新所有腳本?Git從腳本中獲取多個本地存儲庫(ruby?)

我所擁有的一切非常有組織的(文件夾結構):

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

我有一個Ruby腳本來克隆庫與octokit,但是否有關於如何做的git拉(覆蓋/基礎重建地區)的任何建議所有的倉庫在GitClones

正常情況下,我只是在我即將使用該回購協議時進行一次拉動,但是我會去互聯網連接有時可用的地方。所以我想在互聯網上更新我所能做的一切。

謝謝! (Running osx 10.8.2)

回答

6

如果你必須這樣做在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目錄中的文件。

+1

太棒了!謝謝,stackoverflow再次拯救! – AtHeartEngineer

4

當然,但爲什麼使用紅寶石時,shell就足夠了?

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

我變得喜歡紅寶石,我想如果我的腳本大部分都是用紅寶石書寫的,我可能會堅持下去。但外殼工作!謝謝! – AtHeartEngineer

1

將glob的開頭改爲味道。這做了兩件有用的東西:

  1. 它唯一的Git拉時,它包含子目錄git的
  2. 它會跳過點迪爾斯因爲沒有人有混帳回購以點開始()。

享受

# 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 
0

修訂,以更好地提供輸出,並與操作系統無關。這一個清理本地更改,並更新代碼。

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