Git用脚本拉出多个本地存储库(ruby?)

时间:2012-11-26 21:47:57

标签: ruby macos git github repository

我从github克隆了~30个git存储库,用于web / ruby​​ / javascript开发。是否可以使用脚本批量更新所有这些内容?

我的一切都很有条理(文件夹结构):

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

我有一个ruby脚本来使用octokit克隆存储库,但有关于如何在GitClones下的所有存储库中执行git pull(覆盖/重新定位本地)的任何建议吗?

通常情况下,每当我要使用该回购时,我都会做一次拉动,但我会去一个互联网连接有时可用的地方。所以我想在互联网上更新我能做的一切。

谢谢! (运行osx 10.8.2)

4 个答案:

答案 0 :(得分: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 :(得分:4)

当然,但为什么在外壳足够时使用红宝石?

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

答案 2 :(得分:1)

将glob的开头改为品味。这有两个有用的东西:

  1. 只有git pull才包含.git subdir
  2. 它跳过点(。)dirs,因为没有人有以点开头的git repos。
  3. 享受

    # 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
    

答案 3 :(得分: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