2011-09-30 21 views
46

Tôi đã tạo di chuyển, chạy rake db:migrate, đã tăng số phiên bản db/schema.rb của tôi. Sau đó, tôi đã làm một git fetch origin master và thấy rằng có những thay đổi từ các thành viên trong nhóm của tôi. Vì vậy, tôi đã thực hiện một số git stashgit rebase FETCH_HEAD, theo sau là git stash pop. Điều này dẫn đến xung đột trong db/schema.rb trên số phiên bản.Quản lý xung đột trong schema.rb được tạo bởi thao tác Git

Upstream>>> 
ActiveRecord::Schema.define(:version => 20110930179257) do 
=========== 
ActiveRecord::Schema.define(:version => 20110930161932) do 
<<<Stashed 

Tôi nghĩ khắc phục thích hợp sẽ là tăng số phiên bản theo cách thủ công lên thứ gì đó cao hơn thượng nguồn.

Đây có phải là tin tức hợp lý hoặc không tốt?

Cảm ơn, Max

+1

Để trả lời câu hỏi của riêng tôi, tay incrementing phiên bản số là không cần thiết, và, trong khả năng tất cả, một ý tưởng tồi. Tất cả những gì cần thiết, từ những gì tôi có thể nói, là chỉ chấp nhận số phiên bản ngược dòng. – maxenglander

Trả lời

81

Nếu cơ sở dữ liệu hiện tại của bạn có giản đồ chính xác, bạn nên:

  • Run cấp phát di cư (nếu có)

    rake db:migrate 
    
  • Ghi đè schema.rb của bạn từ lược đồ cơ sở dữ liệu hiện tại của bạn

    rake db:schema:dump 
    
  • Và cam kết

+0

Không chắc chắn nếu điều này làm việc trong tình huống của tôi. Tôi đã chờ di chuyển từ thượng nguồn. – maxenglander

+10

Nếu bạn có di chuyển đang chờ xử lý, hãy chạy chúng sau đó 'rake db: schema: dump' – Xorlev

+0

Điều này sẽ không tạo yêu cầu kéo mà không thay đổi phiên bản trong schema.rb, nếu phiên bản của từ xa cao hơn? –

0

Một lựa chọn là phải có một phiên bản kịch bản thủ công chỉ là phụ. Ở đó bạn muốn xung đột. Schema là thứ khiến bạn khó chịu nếu bạn không giữ nó trên đầu nó. Vì vậy, một khi bị cắn, hai lần nhút nhát, tôi không nhớ giữ lược đồ và tra cứu thông tin (danh sách các loại khách hàng) với một chương trình quản lý thay đổi chỉ phụ gia.

6

Theo this answer, xung đột được đảm bảo. Người dùng phải hợp nhất thủ công và đặt phiên bản là cao hơn của cả hai.

16

Khi tôi thấy mình bị xung đột này, tôi chỉ cần di chuyển cơ sở dữ liệu. Cho dù có di chuyển đang chờ xử lý hay không, cuộc xung đột sẽ được sửa chữa.

+0

câu trả lời hay nhất, cảm ơn – dowi

0

Tôi cảm thấy cách tiếp cận tốt nhất là làm rake db:drop db:create db:migrate để tạo lại giản đồ bằng cách sử dụng di chuyển chỉ tồn tại trên nhánh hiện tại. Bằng cách đó, việc di chuyển từ các nhánh khác sẽ không bị rò rỉ vào tệp lược đồ của bạn và cho bạn đau đầu sau này - trong trường hợp nếu bạn chuyển đổi nhiều nhánh.

2

Đây là những gì tôi làm khi sáp nhập tổng thành chi nhánh tính năng của tôi thất bại trong các cuộc xung đột trong db/schema.rb:

$ git merge --abort 
$ git checkout master 
$ rake db:drop db:create db:migrate 
$ git checkout -- db/schema.rb 
$ git checkout my_feature_branch 
$ rake db:migrate 
$ git add db/schema.rb 
$ git commit -m 'Updated schema' 
$ git merge master 
1

~/bin/update-schema-rb:

#!/usr/bin/env bash 

git co master 
bin/rake db:reset db:seed 
git co - 
bin/rake db:migrate 
Các vấn đề liên quan