1

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

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

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

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

通常,每当我要使用该存储库时,我都会拉一下,但我要去一个只有有时才可以使用互联网连接的地方。所以我想在有互联网的时候更新我能做的一切。

谢谢!(运行 osx 10.8.2)

4

4 回答 4

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 目录中。

于 2012-11-26T22:24:33.387 回答
4

当然可以,但是当 shell 足够时为什么要使用 ruby​​ 呢?

function update_all() {
  for dir in GitClones/*; do 
    cd "$dir" && git pull
  done
}
于 2012-11-26T22:12:30.723 回答
1

根据口味更改 glob 的开头。这做了两件有用的事情:

  1. 只有 git pull 包含 .git subdir
  2. 它跳过点 (.) 目录,因为没有人拥有以点开头的 git repos。

享受

# 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
于 2012-11-26T22:59:46.277 回答
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
于 2014-02-28T12:28:54.953 回答