Cơ sở dữ liệu riêng cho từng chi nhánh
Đó là cách duy nhất để bay.
Cập nhật ngày 16 tháng 10 năm 2017
Tôi đã trở lại điều này sau một thời gian và thực hiện một số cải tiến:
- Tôi đã thêm một tác vụ cào không gian tên khác để tạo một nhánh và sao chép cơ sở dữ liệu trong một cú trượt, với
bundle exec rake git:branch
.
- Bây giờ tôi nhận ra rằng nhân bản từ chủ không phải luôn luôn là những gì bạn muốn làm vì vậy tôi đã nói rõ hơn rằng
db:clone_from_branch
nhiệm vụ cần một biến SOURCE_BRANCH
và TARGET_BRANCH
môi trường. Khi sử dụng git:branch
nó sẽ tự động sử dụng nhánh hiện tại là SOURCE_BRANCH
.
- Tái cấu trúc và đơn giản hóa.
config/database.yml
Và để giúp bạn dễ dàng hơn, đây là cách bạn cập nhật database.yml
tệp của mình để xác định động tên cơ sở dữ liệu dựa trên nhánh hiện tại.
<%
database_prefix = 'your_app_name'
environments = %W( development test )
current_branch = `git status | head -1`.to_s.gsub('On branch ','').chomp
%>
defaults: &defaults
pool: 5
adapter: mysql2
encoding: utf8
reconnect: false
username: root
password:
host: localhost
<% environments.each do |environment| %>
<%= environment %>:
<<: *defaults
database: <%= [ database_prefix, current_branch, environment ].join('_') %>
<% end %>
lib/tasks/db.rake
Đây là một nhiệm vụ Rake để dễ dàng sao chép cơ sở dữ liệu của bạn từ chi nhánh này sang chi nhánh khác. Điều này có một SOURCE_BRANCH
và một TARGET_BRANCH
biến môi trường. Dựa trên nhiệm vụ của @spalladino .
namespace :db do
desc "Clones database from another branch as specified by `SOURCE_BRANCH` and `TARGET_BRANCH` env params."
task :clone_from_branch do
abort "You need to provide a SOURCE_BRANCH to clone from as an environment variable." if ENV['SOURCE_BRANCH'].blank?
abort "You need to provide a TARGET_BRANCH to clone to as an environment variable." if ENV['TARGET_BRANCH'].blank?
database_configuration = Rails.configuration.database_configuration[Rails.env]
current_database_name = database_configuration["database"]
source_db = current_database_name.sub(CURRENT_BRANCH, ENV['SOURCE_BRANCH'])
target_db = current_database_name.sub(CURRENT_BRANCH, ENV['TARGET_BRANCH'])
mysql_opts = "-u #{database_configuration['username']} "
mysql_opts << "--password=\"#{database_configuration['password']}\" " if database_configuration['password'].presence
`mysqlshow #{mysql_opts} | grep "#{source_db}"`
raise "Source database #{source_db} not found" if $?.to_i != 0
`mysqlshow #{mysql_opts} | grep "#{target_db}"`
raise "Target database #{target_db} already exists" if $?.to_i == 0
puts "Creating empty database #{target_db}"
`mysql #{mysql_opts} -e "CREATE DATABASE #{target_db}"`
puts "Copying #{source_db} into #{target_db}"
`mysqldump #{mysql_opts} #{source_db} | mysql #{mysql_opts} #{target_db}`
end
end
lib/tasks/git.rake
Tác vụ này sẽ tạo một nhánh git khỏi nhánh hiện tại (chính hoặc nếu không), kiểm tra nó và sao chép cơ sở dữ liệu của nhánh hiện tại vào cơ sở dữ liệu của nhánh mới. Đó là AF trơn tru.
namespace :git do
desc "Create a branch off the current branch and clone the current branch's database."
task :branch do
print 'New Branch Name: '
new_branch_name = STDIN.gets.strip
CURRENT_BRANCH = `git status | head -1`.to_s.gsub('On branch ','').chomp
say "Creating new branch and checking it out..."
sh "git co -b #{new_branch_name}"
say "Cloning database from #{CURRENT_BRANCH}..."
ENV['SOURCE_BRANCH'] = CURRENT_BRANCH # Set source to be the current branch for clone_from_branch task.
ENV['TARGET_BRANCH'] = new_branch_name
Rake::Task['db:clone_from_branch'].invoke
say "All done!"
end
end
Bây giờ, tất cả những gì bạn cần làm là chạy bundle exec git:branch
, nhập tên nhánh mới và bắt đầu tiêu diệt zombie.