2015-04-26 13 views
15

Tôi đang lưu trữ một dự án OSS trên GitHub có một vài nhà phát triển khác nhau. Dự án này là một ứng dụng web đang sử dụng một AppCache để cho trình duyệt biết các tệp nào sẽ được cung cấp ngoại tuyến.Git: xử lý một appcache?

Bản chất của tệp appcache cần được cập nhật (ví dụ: chúng tôi đang sử dụng dấu thời gian trong nhận xét cho điều đó) khi tệp trong bộ nhớ cache thay đổi để làm mất hiệu lực bộ nhớ cache và buộc trình duyệt phải tải lại tất cả các tập tin.
Khi mọi người đang làm việc trên các nhánh phát triển khác nhau, họ đang cập nhật dấu thời gian trong appcache với mỗi cam kết của họ.

Vấn đề là bây giờ, điều này sẽ tạo ra xung đột đang ngăn việc hợp nhất tự động.

  • Làm cách nào để giải quyết vấn đề này theo cách không xung đột xảy ra trong tương lai?
  • Các nhóm phát triển khác đang làm gì ở cùng một tình huống?

Sử dụng CVS tôi có thể thay thế các dấu thời gian với một Id $ $ để cho các chương trình xử lý nó tự động ...

+0

Câu hỏi là chung chung và cũng nên được trả lời chung chung. Nhưng đối với thông tin: trong trường hợp của tôi, ứng dụng chỉ sử dụng các tệp JavaScript, CSS và HTML tĩnh để một máy chủ web cực kỳ đơn giản là đủ. Một số phần tùy chọn đang sử dụng PHP - nhưng đó không phải là một yêu cầu khó khăn cho môi trường thời gian chạy (nhưng tôi đoán 100% các máy chủ web phát triển có sẵn). Nếu có một giải pháp mà Git nên gọi một kịch bản thì nên xem xét rằng các nhà phát triển đang sử dụng Linux, Windows và MacOS. – Chris

Trả lời

7

Tôi có một cơ thể lớn các kinh nghiệm làm việc với các ứng dụng AppCache hậu thuẫn phục vụ bởi một chồng Rails .

Tôi đã tìm thấy điều dễ nhất từ ​​trước đến nay là không phải mã hóa phiên bản của bạn vào AppCache của bạn. Bạn nên tạo tệp một cách linh động và tạo ra một giá trị duy nhất cho phiên bản theo chương trình. Lý tưởng nhất, không ai nên giới thiệu sự thay đổi cho bản thân các biểu hiện, họ nên giới thiệu sự thay đổi cho các đầu vào mà tạo ra một cách có lập trình tệp.

Điều này không thực sự độc đáo với AppCache. Nếu bạn thấy một dòng cụ thể cần được sửa đổi trong hầu hết mọi cam kết, có thể bạn không nên mã hóa dòng đó. Nó sẽ được tạo ra theo một cách nào đó, dựa trên bất kỳ thay đổi nào trong repo nhắc thay đổi dòng đó.

Về miền lễ hội AppCache, tôi đã tìm thấy những điều đơn giản nhất để làm là:

  • trong phát triển, bao gồm thời gian qua biến đổi của tất cả các tập tin trong appcache
  • trong sản xuất, bao gồm các ID cam kết của cam kết Git được triển khai

Tôi không biết bạn đang sử dụng ngôn ngữ nào, nhưng trong thế giới Rails, tệp kê khai AppCache của tôi trông giống như sau. Không ai sẽ bao giờ phải thay đổi tập tin này, họ sẽ chỉ làm tăng thêm hoặc loại bỏ các tập tin từ @files mảng, được quản lý trong bộ điều khiển phục vụ lên manifest này:

CACHE MANIFEST 

<% if Rails.env.development? %> 
<% @cached_files.each do |file| %> 
# <%= File.mtime(file) %> 
<% end %> 
<% else %> 
# <%= `git rev-parse HEAD` %> 
<% end %> 

CACHE: 
<% @cached_files.each do |file| %> 
<%= file %> 
<% end %> 

NETWORK: 
* 

Phần đầu tiên, được bọc trong Rails.env.development? kết quả đầu ra một loạt của các dòng nhận xét, chứa thời gian sửa đổi lần cuối của mọi tệp được bao gồm trong tệp kê khai. Điều này có nghĩa là, trong quá trình phát triển, AppCache sẽ tự động hết hạn bất kỳ khi nào bất kỳ tệp nào được bao gồm trong đó được sửa đổi.

Trong quá trình sản xuất, AppCache đã hết hạn khi một cam kết mới được triển khai. Điều này có thể là quá mức cần thiết cho bạn; nếu bạn muốn tránh không cần thiết hết hạn AppCache của người dùng của bạn, bạn nên làm một cái gì đó thông minh hơn như băm các tập tin có liên quan để bộ nhớ cache hết hạn khi nội dung của họ thay đổi.

Cuối cùng, tôi tăng cường viết một thư viện nhỏ để giúp loại bỏ các bit lặp đi lặp lại của việc tạo tệp kê khai. Trên cơ hội ra bạn đang sử dụng Rails, bạn có thể tìm thấy nó hữu ích: https://github.com/meagar/rails_appcache

1

Sử dụng CVS tôi có thể thay thế các dấu thời gian với một Id $ $ để cho các chương trình xử lý nó tự động ...

git có thể gọi git log's --format= handler trên các tệp đã chọn khi bạn xuất mã để triển khai.

echo \*.meta export-subst >>.gitattributes 

echo '$Format:%cD$' >test.meta # there's lots of % codes available. 
git add .; git commit -m-; 

git archive v2.3.6 | tar xCf /dir/that/appcache/is/watching - 
1

Để bắt chước việc mở rộng CVS từ khoá trong một Git thanh toán đơn giản, bạn có thể sử dụng bộ lọc sạch/smudge trong Git, như đã giải thích ở đây: Keyword Expansion.

Một tùy chọn khác là tiếp tục thực hiện theo cách bạn làm, nhưng define a custom merge driver sẽ xóa dấu thời gian trước khi hợp nhất, thực hiện hợp nhất, sau đó thêm lại dấu thời gian mới.

Các vấn đề liên quan