我希望我的Rails应用程序在访问者在Web应用程序上输入一些值后提交并推送git更改。 在开发期间,我使用a Ruby Gem来提交和推送更改,这会将存储库克隆到文件系统上。更改将写入这些文件中,然后由Gem提交并推送。
Heroku只提供只读文件系统。
有没有办法
我是否忘记了在远程git存储库上实现更改的任何明显方法?
答案 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
这不是一个完美的解决方案,但对我的用例非常有用。