我希望我的 Rails 应用程序在访问者在 Web 应用程序上输入一些值后提交并推送 git 更改。在开发过程中,我使用Ruby Gem提交和推送更改,从而将存储库克隆到文件系统上。更改被写入这些文件,然后由 Gem 提交和推送。
Heroku 仅提供只读文件系统。
有没有办法
- 在不访问文件系统的情况下提交和推送文件?
- 将存储库克隆到一个临时文件夹并在那里提交?
- 使用其他类似于 Heroku 的主机,它允许写入文件系统?
我是否忘记了在远程 git 存储库上实现更改的任何明显方法?
我希望我的 Rails 应用程序在访问者在 Web 应用程序上输入一些值后提交并推送 git 更改。在开发过程中,我使用Ruby Gem提交和推送更改,从而将存储库克隆到文件系统上。更改被写入这些文件,然后由 Gem 提交和推送。
Heroku 仅提供只读文件系统。
有没有办法
我是否忘记了在远程 git 存储库上实现更改的任何明显方法?
几年前我做过类似的事情,当时在 heroku 上工作,今天仍然可以工作。
基本上:您实际上可以使用文件系统,在/tmp
.
因此,您必须在该存储库中克隆并在那里进行更改。
然而,虽然这在 heroku 上绝对是可能的,但您最终会得到很多特定于平台的代码,这可能会使移出 heroku 变得困难。
使用评论中推荐的 GitHub 文件 CRUP API 似乎是一个更好的解决方案。
我决定使用亚马逊云来解决这个任务。使用“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
这不是一个完美的解决方案,但非常适合我的用例。