2010-04-20 32 views
15

Tôi đang làm việc với kho lưu trữ git đang lưu trữ dữ liệu cho một trang web. Nó chứa một tệp .htaccess, với một số giá trị phù hợp cho máy chủ sản xuất. Để tôi làm việc trên trang web, tôi phải thay đổi một số giá trị trong tệp, nhưng tôi không bao giờ muốn cam kết những thay đổi này hoặc tôi sẽ phá vỡ máy chủ.Làm thế nào để bạn yêu cầu git bỏ qua vĩnh viễn các thay đổi trong một tệp?

Vì .gitignore không hoạt động đối với các tệp được theo dõi, tôi đã sử dụng "git update-index --assume-constant .htaccess" để bỏ qua các thay đổi trong tệp, tuy nhiên điều này chỉ hoạt động cho đến khi bạn chuyển nhánh. Khi bạn thay đổi trở lại nhánh ban đầu, các thay đổi của bạn sẽ bị mất.

Có cách nào để yêu cầu git bỏ qua các thay đổi trong tệp để nó một mình khi thay đổi nhánh? (Cũng giống như nếu tập tin đã được theo dõi.)

Trả lời

9

Bạn có thể sử dụng một smudge/clean process (một gitattribute filter driver, mô tả in ProGit)

clean smudge

Mỗi lần bạn cập nhật thư mục làm việc của bạn, bạn sẽ có cơ hội để thay thế nội dung của số .htaccess với nội dung được xác định trước, chính xác cho môi trường hiện tại của bạn.
Trong giai đoạn sạch sẽ, sau đó bạn sẽ khôi phục nội dung gốc, như thể bạn chưa bao giờ chạm vào tệp đó.

+1

Perfect! Điều này giải quyết được vấn đề của tôi. Tôi đã thêm ".htaccess filter = htaccess" vào .git/info/attributes, sau đó trong .git/config tôi đã thêm: [filter "htaccess"] clean = sed 's |/mypath |/dev' smudge = sed 's |/dev |/mypath' Và bây giờ mọi tham chiếu đến/dev/cái gì đó trong tập tin .htaccess sẽ được thay thế bằng/mypath/something, và được khôi phục ở cuối có nghĩa là tôi thậm chí có thể chỉnh sửa tập tin và commit những thay đổi của tôi, mà không nhận được phiên bản/mypath trong repo! – Malvineous

2

phương pháp tiếp cận dựa trên git: sử dụng chi nhánh sản xuất và giữ các thay đổi cụ thể cho môi trường sản xuất của bạn trong đó. Để phát hành vào sản xuất, hãy hợp nhất chi nhánh chính của bạn vào chi nhánh sản xuất của bạn.

phương pháp triển khai dựa trên triển khai: sử dụng công cụ (chẳng hạn như capistrano/cfengine/...) để tự động hóa quy trình triển khai của bạn. Điều này có nhiều ưu điểm, một trong số đó là khả năng giữ cấu hình riêng biệt với mã của bạn.

+0

Tôi hiện đang sử dụng cách tiếp cận dựa trên git (với một nhánh sản xuất) nhưng mỗi nhà phát triển có một tệp .htaccess riêng biệt cho môi trường phát triển của họ. Ngay cả với một nhánh sản xuất riêng biệt, chúng tôi vẫn phải tự tay tránh các tệp .htaccess tùy chỉnh của chúng tôi vào nhánh chính. Cấp này sẽ không phá vỡ máy chủ, nhưng nó clutters kho lưu trữ khi nó xảy ra. – Malvineous

7

Chỉ cần cho git để đảm nhận các tập tin là không thay đổi:

$ git update-index --assume-unchanged FILE [FILE ...] 

Từ hướng dẫn:

--assume-unchanged, --no-assume-unchanged 
     When these flags are specified, the object names recorded for the paths are not updated. Instead, these options set and unset the "assume unchanged" bit for the paths. When the "assume unchanged" bit is on, git stops checking the 
     working tree files for possible modifications, so you need to manually unset the bit to tell git when you change the working tree file. This is sometimes helpful when working with a big project on a filesystem that has very slow 
     lstat(2) system call (e.g. cifs). 

     This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to modify this file in the 
     index e.g. when merging in a commit; thus, in case the assumed-untracked file is changed upstream, you will need to handle the situation manually. 

Tìm thấy trong How to Ignore Changes in Tracked Files With Git

+0

FYI điều này đã được đề cập trong câu hỏi là không làm việc ... có một cái gì đó thay đổi kể từ đó để làm cho nó hoạt động ngay bây giờ? – Malvineous

+0

@Malvineous, tôi hiểu sai một phần của câu hỏi, nhưng rõ ràng, nó hoạt động ngay bây giờ: https://gist.github.com/4564516 –

+0

Đối với bất cứ ai tự hỏi, để theo dõi các tập tin một lần nữa sử dụng '--no-giả-không thay đổi' . – SUPERCILEX

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