Pisahkan Database untuk setiap Cabang
Ini satu-satunya cara untuk terbang.
Perbarui 16 Oktober 2017
Saya kembali ke ini setelah beberapa waktu dan melakukan beberapa perbaikan:
- Saya telah menambahkan tugas rake namespace lain untuk membuat cabang dan mengklon database dalam satu gerakan, dengan
bundle exec rake git:branch
.
- Saya menyadari sekarang bahwa kloning dari master tidak selalu apa yang ingin Anda lakukan, jadi saya membuatnya lebih eksplisit bahwa
db:clone_from_branch
tugas yang diambil SOURCE_BRANCH
dan TARGET_BRANCH
variabel lingkungan. Saat menggunakannya git:branch
akan secara otomatis menggunakan cabang saat ini sebagai SOURCE_BRANCH
.
- Refactoring dan penyederhanaan.
config/database.yml
Dan untuk membuatnya lebih mudah bagi Anda, inilah cara Anda memperbarui database.yml
file Anda untuk secara dinamis menentukan nama basis data berdasarkan cabang saat ini.
<%
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
Inilah tugas Rake untuk mengkloning basis data Anda dari satu cabang ke cabang lainnya dengan mudah. Ini membutuhkan variabel a SOURCE_BRANCH
dan TARGET_BRANCH
lingkungan. Didasarkan dari tugas @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
Tugas ini akan membuat cabang git dari cabang saat ini (master, atau lainnya), memeriksanya dan mengkloning basis data cabang saat ini ke dalam basis data cabang baru. Ini AF yang apik.
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
Sekarang, yang perlu Anda lakukan adalah menjalankan bundle exec git:branch
, masukkan nama cabang baru dan mulai membunuh zombie.