प्रत्येक शाखा के लिए अलग डेटाबेस
यह उड़ान भरने का एकमात्र तरीका है।
अपडेट 16 अक्टूबर, 2017
मैं काफी समय के बाद इस पर लौटा और कुछ सुधार किए:
- मैंने एक शाखा बनाने के लिए एक और नेमस्पेस रेक कार्य जोड़ा है और डेटाबेस को एक झपट्टा में गिर गया है, साथ
bundle exec rake git:branch।
- मुझे अब एहसास हुआ कि मास्टर से क्लोनिंग हमेशा वह नहीं होता है जो आप करना चाहते हैं इसलिए मैंने यह अधिक स्पष्ट कर दिया है कि
db:clone_from_branchकार्य एक SOURCE_BRANCHऔर एक TARGET_BRANCHपर्यावरण चर लेता है । git:branchइसका उपयोग करते समय स्वचालित रूप से वर्तमान शाखा का उपयोग करेगा SOURCE_BRANCH।
- रिफैक्टरिंग और सरलीकरण।
config/database.yml
और यह आप पर आसान बनाने के लिए, यहां बताया गया है कि आप अपनी database.ymlफ़ाइल को वर्तमान शाखा के आधार पर डेटाबेस के नाम को गतिशील रूप से कैसे निर्धारित करते हैं।
<%
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
अपने डेटाबेस को एक शाखा से दूसरी शाखा में आसानी से क्लोन करने के लिए यहां एक रेक कार्य है। यह एक SOURCE_BRANCHऔर एक TARGET_BRANCHपर्यावरण चर लेता है । @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
यह कार्य वर्तमान शाखा (मास्टर, या अन्यथा) से एक गिट शाखा बनाएगा, इसे जांचें और वर्तमान शाखा के डेटाबेस को नई शाखा के डेटाबेस में क्लोन करें। यह एएफ चालाक है।
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
अब, आपको बस इतना करना होगा bundle exec git:branchकि नई शाखा नाम दर्ज करें और लाश को मारना शुरू करें।