0

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

Heroku 仅提供只读文件系统。

有没有办法

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

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

4

2 回答 2

1

几年前我做过类似的事情,当时在 heroku 上工作,今天仍然可以工作。

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

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

于 2013-11-05T10:09:17.347 回答
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

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

于 2013-11-08T14:02:28.507 回答