Heroku(和类似的服务):克隆,提交和推送到Git Repository

时间:2013-11-03 22:25:07

标签: ruby-on-rails ruby git heroku

我希望我的Rails应用程序在访问者在Web应用程序上输入一些值后提交并推送git更改。 在开发期间,我使用a Ruby Gem来提交和推送更改,这会将存储库克隆到文件系统上。更改将写入这些文件中,然后由Gem提交并推送。

Heroku只提供只读文件系统。

有没有办法

  • 在不访问文件系统的情况下提交和推送文件?
  • 将存储库克隆到临时文件夹并提交到那里?
  • 使用类似于Heroku的其他主机,允许写入文件系统?

我是否忘记了在远程git存储库上实现更改的任何明显方法?

2 个答案:

答案 0 :(得分:1)

几年前我做过something similar,当时在heroku工作,今天仍然可以使用。

基本上:您可以在/tmp中实际使用文件系统 因此,您必须在该存储库中克隆并在那里进行更改。

然而,虽然这在heroku上肯定是可行的,但你最终会得到很多特定于平台的代码,这可能会使heroku的移出变得困难。
使用评论中建议的GitHub文件CRUP API似乎是一个更好的解决方案。

答案 1 :(得分:1)

我决定使用亚马逊云来解决这个问题。 使用'aws-sdk'gem,可以轻松地将文件更改写入S3在线空间。

然后我使用我的CIS下载最新文件并将它们提交到存储库,这是一个简单的ruby脚本:

require 'git'
require 'aws-sdk'
require 'fileutils'


folder_name = "configs"

begin
    g = Git.open(folder_name)
rescue
    puts "Cloning repo..."
    system("mkdir #{folder_name}")
    g = Git.clone("git@url...", folder_name, :path => ".")
end


g.config("user.name", "GitBot")
g.config("user.email", "...")
g.pull

FileUtils.rm_rf(Dir.glob("#{folder_name}/*"))

s3 = AWS::S3.new
bucket = s3.buckets["bucket name"] if not bucket


bucket.objects.each do |obj|
    if obj.content_length > 0
        # only files
        puts "Writing #{obj.key}"

        File.write("#{folder_name}/#{obj.key}", obj.read)
    else
        puts "Creating folder #{obj.key}"
        FileUtils.mkdir_p "#{folder_name}/#{obj.key}"
    end
end

begin
    g.add(:all => true)
    g.commit("Automatic commit from GitBot")
    g.push
    puts "Successfully pushed updates"
rescue
    puts "Nothing to commit"
end

这不是一个完美的解决方案,但对我的用例非常有用。