Cách tốt nhất để nâng cấp lõi Drupal mà không phá vỡ repo Git và trang web sản xuất


13

Tôi đã có một kho lưu trữ Git trong đó tất cả mã của tôi nằm trong nhánh chính và trước đây tôi chỉ bỏ qua tất cả các tệp Drupal, do đó tôi giữ một khoảng cách chặt chẽ giữa mã mà tôi đã viết (hoặc sửa đổi hoặc có thể sửa đổi) và mã có thể được tạo ra với Drush hoặc bất cứ điều gì.

Đây dường như là một chiến lược tốt cho đến khi tôi phải nâng cấp Drupal. Tôi nhận ra rằng tôi muốn có thể quay trở lại nếu mọi thứ trở nên tồi tệ, và công cụ nào tốt hơn để sử dụng hơn Git để làm điều đó. Tôi nghĩ rằng đây sẽ là tình huống hoàn hảo cho một nhánh tính năng, vì vậy tôi đã tạo một drupal-7.14nhánh, tự nó .gitignorebỏ qua tất cả các tệp mã và cài đặt của mình và chỉ chú ý đến các tệp là một phần của cài đặt Drupal mà tôi sẽ không t được chạm vào. Tôi đã thực hiện nâng cấp bằng tay (tải xuống, giải nén, gỡ bỏ, sao chép), sắp xếp qua các trường hợp đường biên như robot.txt và .htaccess và ghi đè lên .gitignore của Drupal bằng chính tôi. Tôi đã sửa một số cài đặt hoạt động với 7.14 nhưng không phải với 7.15, để phục hồi từ lỗi 500, và sau đó mọi thứ dường như hoàn hảo. Tôi đổi tên chi nhánh thành drupal-7.15và chuẩn bị đi trên con đường hạnh phúc.

CHO Ôi!

Nếu tôi hợp nhất drupal-7.15chi nhánh với chủ, tôi sẽ mất việc tách mã.

Có lẽ có một số cách để chuyển đổi một nhánh thành mô hình con. Giả sử điều đó là có thể, đó có thể là chiến lược tốt nhất. Tôi đã biết trước khi tôi làm điều này rằng các mô hình con là giải pháp "đúng", nhưng vì tôi không nhận ra tác dụng phụ của việc sử dụng các nhánh cho các tệp không bị theo dõi trước đó, tôi đã quyết định cắt góc và đi theo con đường đó. (Ngoài ra, tất cả các cách tiếp cận mà tôi đã thấy khi sử dụng các mô hình con với Drupal đều cho rằng bạn đang bắt đầu một dự án mới và Drupal sẽ là nhánh chính. Tôi không mong muốn đặt mã của người khác thành nhánh chính và tôi đã có một repo với một nhánh chính. Điều này có vẻ như sẽ phức tạp không cần thiết chỉ để thực hiện nâng cấp.)

Có thể có một số giải pháp khác mà tôi chưa từng nghĩ đến.

Làm thế nào tôi có thể phục hồi tốt nhất từ ​​điều này với ít nhược điểm nhất có thể?

CẬP NHẬT : Đây là bản phát triển (trong máy ảo Linux trên máy tính xách tay của tôi) và chưa đi vào sản xuất. Vào thời điểm chúng tôi đi vào sản xuất, tôi dự định sẽ thu gọn mọi thứ trong các mô-đun tính năng, nhưng điều đó vẫn chưa được thực hiện.

CẬP NHẬT 2 : Submodules có thể không hoạt động. Theo Pro Git , "Submodules cho phép bạn giữ một kho lưu trữ Git như một thư mục con của kho lưu trữ Git khác". Drupal không cung cấp bất kỳ sự tách biệt tốt đẹp như vậy. Thay vì tất cả mã Drupal nằm trong thư mục con, mối quan hệ ít nhiều bị đảo ngược, nhưng vẫn không có sự tách biệt rõ ràng, vì bạn có thể chỉnh sửa .htaccess và robot.txt, do đó mã của bạn và repo Drupal được trộn lẫn với nhau. Tôi đang tìm cách giải quyết vấn đề này .


Câu hỏi của bạn thực sự là về git. Tôi nghĩ rằng bạn sẽ nhận được câu trả lời tốt hơn bằng cách di chuyển đến một trang web không phải là Drupal cụ thể. Về nâng cấp: Tôi luôn thực hiện nâng cấp bằng cách xây dựng tệp tạo trong một thư mục mới và sau đó cập nhật liên kết tượng trưng từ thư mục công cộng cũ sang thư mục mới, điều đó làm cho việc khôi phục mã trở nên tầm thường.
Letharion

2
@Letharion Tôi không đồng ý. Mọi người sẽ trải qua quá trình nâng cấp trang web của họ từ phiên bản hiện tại lên phiên bản mới. Sử dụng git để nâng cấp lõi là khá phổ biến, vì đây là phương pháp được sử dụng rộng rãi để nâng cấp các mô-đun. Rất nhiều người sẽ đấu tranh với vấn đề này, như tôi đã có trước đây. Hiện tại không có tài liệu tốt trên web giải quyết vấn đề này và tôi tin rằng đây là một nơi tốt cho nó.
iStryker

Chỉ cần làm rõ, tôi nghĩ rằng một câu hỏi về "Pratice tốt nhất để nâng cấp Drupal" sẽ phù hợp hơn, vì câu hỏi này thực sự là "Làm thế nào để tôi sửa chữa một lỗi git", mà tôi không nghĩ là ở đây. Không có bất kỳ cảm xúc mạnh mẽ nào về chủ đề này, vì vậy tôi sẽ để nó ở đó. :)
Letharion

Được rồi. Vấn đề Brandon có khá phổ biến. Có lẽ tôi nên tạo một câu hỏi mới hoặc viết lại câu hỏi này (và chuyển phần còn lại sang câu hỏi khác). 2-3 đoạn đầu là phổ biến. Bạn tạo một repo git là 7.x-1.0 và bạn muốn nâng cấp lên 7.x-1.1. Các tệp vấn đề là .gitignore, .htaccess và robot.txt. Đôi khi bạn muốn họ theo dõi vì họ đã được kiểm duyệt, đôi khi bạn không muốn họ theo dõi vì họ đã được kiểm duyệt. Khi nâng cấp repo, bạn tạo một nhánh mới hợp nhất hoặc chỉ cập nhật chính. @Letharion Gợi ý?
iStryker

@Letharion: Tôi đã suy nghĩ về việc có nên đưa câu hỏi này lên StackOverflow dưới dạng câu hỏi Git hay ở đây là câu hỏi Drupal. Nếu tôi đặt nó ở đó mọi người sẽ phàn nàn và nói rằng đây thực sự là về Drupal, và tôi nghĩ họ thực sự đúng. Mặc dù Git có thể là công cụ được sử dụng để sửa chữa tình huống, hướng đi được thực hiện phụ thuộc vào kiến ​​thức về Drupal. Mọi người dùng Drupal đều sử dụng Git (hoặc họ nên nếu họ không), nhưng chỉ một phần nhỏ người dùng Git sử dụng Drupal. Những người trả lời câu hỏi về Git sẽ không hiểu nền tảng của Drupal.
iconoclast

Câu trả lời:


10

Có vẻ như từ cuộc thảo luận ở trên, câu hỏi của bạn không phải là về việc sửa lỗi git repo của bạn, mà là về việc duy trì trang web Drupal trong git và cách thức hoạt động với các cập nhật cốt lõi.

Tôi nghĩ rằng thực tế tiêu chuẩn trên thực tế là giữ tất cả các tệp trong kho lưu trữ của bạn, bao gồm cả lõi Drupal. Việc tách mã Drupal khỏi mã tùy chỉnh có vẻ là một ý tưởng hay, nhưng tôi không nghĩ nó cần thiết và tôi không thấy những lợi thế mà nó mang lại cho bạn. Dường như cũng cho rằng bạn sẽ không bao giờ muốn vá lõi (hoặc phải thực hiện nó như là một phần của việc triển khai của bạn), trong khi đó, đó không phải là cách thực hành tốt nhất, chắc chắn là điều bạn muốn làm nếu có gì đó bị phá vỡ trong sản xuất. Giữ cho cam kết của bạn tốt đẹp và tập trung cũng giúp có được sự tách biệt này.

Giải pháp tôi đã sử dụng là giữ tất cả mã trong cùng một kho lưu trữ, đặt càng nhiều càng tốt trong Tính năng hoặc các loại xuất / mã / cấu hình khác và duy trì một danh sách các bản vá cần được áp dụng cho bên ngoài lõi hộp và đóng góp.

Khi bạn cập nhật lõi, hãy bắt đầu trong môi trường dev của bạn:

  • Đảm bảo thư mục làm việc sạch sẽ
  • Kết xuất cơ sở dữ liệu mới nhất ( drush sql-dump). Hoặc là thực hiện một cam kết với bãi chứa hoặc lưu nó ở một nơi an toàn.
  • Cập nhật lõi ( drush up drupal)
  • Cam kết mọi thay đổi.
  • Kiểm tra tập tin vá. Nếu có bất kỳ bản vá nào cần được áp dụng, hãy áp dụng chúng và thực hiện một cam kết khác
  • Chạy update.php nếu cần thiết (đã được thực hiện nếu bạn sử dụng drush cho bản cập nhật)
  • Kiểm tra trang web dev của bạn. Nếu mọi thứ đều ổn, đẩy mã vào sản xuất. Chạy drush updbvào sản xuất.
  • Nếu có vấn đề và bạn cần hoàn nguyên, hãy hoàn nguyên hoặc đặt lại repo của bạn ( git reset --hard HEAD~2nên thực hiện) hoặc hoàn nguyên hai lần xác nhận nếu bạn muốn giữ lại lịch sử. Thay thế cơ sở dữ liệu của bạn với bãi chứa.

Kết xuất cơ sở dữ liệu là cần thiết vì nếu không bạn không thể hoàn tác các thay đổi được thực hiện cho cơ sở dữ liệu bằng các bản cập nhật. Bạn cũng có thể thực hiện cập nhật trong một nhánh, trong trường hợp hoàn nguyên chỉ có nghĩa là kiểm tra chính. Sẽ hơi bất tiện nếu bạn đang làm việc trên một trang dev vì bạn thực sự không thể quay lại làm chủ và tiếp tục làm việc ở đó song song vì cơ sở dữ liệu.

Sử dụng quy trình công việc phụ đơn giản hơn này sẽ cho phép bạn sử dụng toàn bộ sức mạnh của git khi bạn cần mà không có sự phức tạp của các mô đun con, v.v ... Nếu điều này có vẻ không thỏa đáng, bạn có thể giải thích lý do tại sao bạn cần tách mã hơn nữa không?


0

Từ những nhận xét của tôi ở trên, câu hỏi này bạn có về việc duy trì các tệp trang web Drupal bằng git và cách thức hoạt động với các cập nhật cốt lõi. Bạn đã không đề cập bất cứ điều gì về sao lưu và nâng cấp cơ sở dữ liệu. Tôi sẽ cố gắng không sao chép bất cứ điều gì từ câu trả lời của goron.

Tôi đã tạo một bài đăng blog về vấn đề này Nâng cấp lõi Drupal trên trang web của bạn với Git

Các phương thức thay thế

  1. Chạy lệnh Drush drush up drupal
  2. Áp dụng một bản vá của sự khác biệt giữa các phiên bản. Xem http://drupal.org/node3539234 & http://fuerstnet.de/en/drupal-upTHER-easier

Bạn đã không nói rõ điều này, nhưng nếu bạn muốn theo dõi các thay đổi giữa các phiên bản Drupal, tôi sẽ làm điều này bằng cách sử dụng các thẻ thay vì các nhánh . Khi bạn đã hoàn thành cam kết nâng cấp của mình thành chủ , hãy gắn thẻ mã của bạn là 7.x.


Nếu tôi hiểu chính xác, bạn cũng đề nghị tôi giữ tất cả mã lõi Drupal trong cùng một kho lưu trữ. Đây dường như là sự đồng thuận. Tôi miễn cưỡng, nhưng tôi có thể phải nhượng bộ và làm theo cách đó.
iconoclast

Có tất cả trong một kho lưu trữ. Tôi có các mô-đun, hồ sơ và chủ đề bên trong kho lưu trữ lõi / chính là kho git riêng của họ. Tôi không biết nếu cách tốt nhất, nhưng đó là cách tốt nhất mà tôi biết.
iStryker

giải pháp này cung cấp không có cách nào để quay trở lại. lý do của tôi để bỏ phiếu xuống.
Andre Baumeier

@Serpiente: Tôi không thấy lý do tại sao thiếu cách quay trở lại nên là một lý do cho một downvote. Nếu đó là cách tiếp cận tốt nhất, thế là đủ. Nếu bạn không nghĩ rằng đó là cách tiếp cận tốt nhất, vui lòng nêu rõ tại sao không.
iconoclast

@iconoclast vấn đề của hệ thống sửa đổi là gì nếu bạn không thể quay lại dòng thời gian của mình? ví dụ: nghĩ về một bản cập nhật thất bại - cách nào để phục hồi ở đây? Một phiên bản được vận chuyển của phần mềm "bất cứ thứ gì" cần có sự phụ thuộc rõ ràng, bao gồm đặc biệt là lõi khung. Nếu không, bạn có thể đơn giản bỏ git của mình và bắt đầu thực hiện lại các lần triển khai FTP. chỉ 2 xu của tôi.
Andre Baumeier

0

Tôi đang chạy thiết lập với hai nhánh giống như OP: một nhánh chỉ có mã tùy chỉnh của tôi và một nhánh có cả tệp tùy chỉnh và tệp lõi của tôi. Tôi gặp tình huống tương tự: các tệp lõi bị bỏ qua được loại bỏ khi chuyển đổi giữa các nhánh.

Cuối cùng tôi đã có hai thư mục git giống hệt nhau: - một để làm việc với mã tùy chỉnh của tôi, với các tệp cốt lõi có mặt nhưng bị bỏ qua và tôi sẽ không bao giờ chuyển sang nhánh "đầy đủ" trong thư mục này - một để thực hiện hợp nhất, do đó tôi sẽ chỉ thực hiện chuyển đổi nhánh và hợp nhất trong thư mục này.

Lý do tôi chọn thiết lập hai nhánh này là vì tôi muốn dễ dàng theo dõi tất cả các cam kết cục bộ đối với các tệp lõi, việc kiểm tra và áp dụng lại các mod lõi khi nâng cấp các tệp lõi dễ dàng hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.