Làm thế nào tôi có thể làm cho git bỏ qua các sửa đổi trong tương lai cho một tập tin?


140

Tôi đã tạo một phiên bản mặc định của một tệp có trong kho git. Điều quan trọng là khi ai đó nhân bản kho lưu trữ, họ sẽ nhận được một bản sao của tệp này. Tuy nhiên, tôi muốn đặt git để nó bỏ qua các thay đổi cho tệp này sau này. .gitignorechỉ hoạt động trên các tập tin chưa được theo dõi.

Động lực của tôi là tập tin này chứa thông tin cụ thể của máy. Tôi muốn cung cấp các giá trị mặc định, đồng thời cho phép mọi người thực hiện các thay đổi cục bộ sẽ không bị đẩy trở lại kho lưu trữ gốc, tạo xung đột hợp nhất khi chúng tôi kéo các thay đổi mới.

Chúng tôi thường khá lười biếng và sử dụng git add .rất nhiều, vì vậy tôi khá chắc chắn nếu tôi không thể nói với git bỏ qua tập tin này, những thay đổi đối với nó sẽ kết thúc và bị đẩy.

Tóm lại,

  1. Tôi muốn tạo một tệp, gọi nó default_values.txtđược thêm vào kho git của tôi và được bao gồm khi ai đó sao chép kho lưu trữ đó.
  2. git add .không nên thêm default_values.txtvào cam kết.
  3. Hành vi này nên được truyền cho bất kỳ bản sao của kho lưu trữ.

1
Bạn có thể sử dụng hook git để có hook pre-commit sẽ hủy bỏ cam kết nếu tệp được sửa đổi là default_values.txt (giả sử) không?
sateesh

1
Những người theo chủ nghĩa thuần túy sẽ nói đừng lười biếng và sử dụng khu vực dàn dựng một cách chính xác, đó là những gì nó được dùng cho.
Xint0

Những người theo chủ nghĩa thuần túy sẽ nói sử dụng các kịch bản smudge / clean. Đó là giải pháp dễ bảo trì nhất.
Adam Dymitruk

1
Xint0: đúng. Nhưng làm thế nào để bạn ngăn người khác vô tình đăng nhập?
Alan

Câu trả lời:


115

Như nhiều người khác đã đề cập, một giải pháp hiện đại tốt là:

git update-index --skip-worktree default_values.txt

Điều đó sẽ bỏ qua các thay đổi đối với tệp đó, cả cục bộ và ngược dòng, cho đến khi bạn quyết định cho phép chúng một lần nữa với:

git update-index --no-skip-worktree default_values.txt

Bạn có thể lấy danh sách các tệp được đánh dấu bỏ qua:

git ls-files -v . | grep ^S

Lưu ý rằng không giống như --skip-worktree, --assume-unchangedtrạng thái sẽ bị mất khi thay đổi ngược dòng được kéo.


2
Nếu ai đó kéo repo và chỉnh sửa tệp, những thay đổi trong thư mục của họ có bị bỏ qua không? Tôi hy vọng họ sẽ phải gõ --no-skip-worktreeđể thêm các thay đổi của họ.
neaumusic

3
Những gì được thực hiện với những thay đổi của họ được kiểm soát bởi họ. Nói cách khác, họ sẽ phải đặt Skip-worktree trên tệp trong repo của họ nếu họ không muốn các thay đổi của họ bị đẩy. Nếu đó là một tệp có nghĩa là được gửi cho mọi người và sau đó bỏ qua tất cả các thay đổi tiếp theo, mọi người sẽ phải làm theo các hướng dẫn tương tự.
psychboom

3
Lưu ý rằng bạn có thể phải hoàn tác --skip-worktreetrạng thái của tệp trước khi bạn có thể chuyển nhánh, nếu cùng tệp đó được theo dõi trong nhánh khác.
psychboom

3
hmm, nó hoạt động ... sau khi tôi thực hiện một số thay đổi trong tệp, nó không được hiển thị git status, nhưng khi tôi cố gắng thanh toán đến các chi nhánh khác, tôi đã nhận được error: Your local changes to the following files would be overwritten by checkout: , thậm chí -f không giúp được gìerror: Entry 'wix-stores-merchant-app/demo/credentials.js' not uptodate. Cannot merge.
ykravv

1
Tôi có những bí danh git ignoregit unignore.
Michael - Clay Shirky

48

Những gì bạn đang tìm kiếm là git update-index --assume-unchanged default_values.txt .

Xem tài liệu để biết thêm chi tiết: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html


11
cái này không hoạt động mặc dù nó làm cho git thêm. bỏ qua tệp trên nhánh cục bộ, một bản sao của kho lưu trữ không có hành vi này (nếu bạn thay đổi default_values.txt trong kho lưu trữ được sao chép, nó sẽ được thêm vào cam kết với "git add.")
Marc

6
Có, bởi vì bạn đang thiết lập nó chỉ cho repo địa phương. Bạn không thể đẩy loại thông tin này.
tamasd

8
@Indradhanush - giải pháp này không thỏa mãn tiêu chí 3 - "hành vi nên được truyền cho bất kỳ bản sao nào của kho lưu trữ" - đó là lý do tại sao tôi không chấp nhận nó. Không có nghĩa đó không phải là một câu trả lời hay.
Marc

Tôi không bao giờ nhận thấy tiêu chí thứ 3. Bởi vì tôi đã không tìm kiếm nó. :)
Indradhanush Gupta

3
Đối với các tệp cấu hình cục bộ có cài đặt ứng dụng riêng tư, bạn có thể muốn sử dụng skip-worktreethay vì assume-unchangedthêm thông tin stackoverflow.com/questions/13630849/ Kẻ
Aaron Hoffman

21

Cách tiếp cận tôi thường thấy là tạo một tệp có tên khác, ví dụ: default_values_template.txt và đặt default_values.txt trong .gitignore của bạn. Hướng dẫn mọi người sao chép default_values_template.txt sang default_values.txt trong không gian làm việc cục bộ của họ và thực hiện các thay đổi khi cần thiết.


hmmm ... có lẽ tôi có thể viết một cái móc để tự động sao chép default_values_template sang default_values ​​nếu default_values ​​không tồn tại?
Marc

2
Đây là cách phổ biến nhất để giải quyết điều này theo kinh nghiệm của tôi. Đó là khá nhiều đường dẫn ít kháng cự nhất ở chỗ nó "chỉ hoạt động" và bạn có thể dễ dàng kiểm tra mã của mình xem tệp cấu hình cục bộ có tồn tại hay không và cung cấp một lỗi hữu ích nếu không.
Jani Hartikainen

Tôi nghĩ rằng giải pháp thực sự là làm một cái gì đó như thế này, tốt nhất là với một kịch bản được thực thi bất cứ khi nào bạn kéo hoặc sao chép. Một ý tưởng là mọi thứ có phần mở rộng cụ thể (giả sử .basefile) sẽ được sao chép vào một tệp có phần mở rộng bị hủy và sau đó tên tệp được thêm vào .gitignore trong thư mục đó. Vì vậy, tôi sẽ tạo một tệp default_values.txt.basefile và cam kết điều đó. Tôi không có git hoặc perl chops để làm điều này, nhưng tôi sẽ hỏi một người bạn làm và cho bạn biết làm thế nào nó hoạt động.
Marc

1
@AdamDymitruk: Có, có thể sử dụng sạch / smudge trong trường hợp này, nhưng không rõ ràng rằng đó là lựa chọn tốt nhất. Ví dụ, điều này sẽ làm cho nó khá khó khăn nếu mọi người thực sự muốn thay đổi tệp, vì sự sạch sẽ / nhoè sẽ cản trở. Tôi thực sự sẽ mở đầu cho cách tiếp cận được mô tả ở đây.
sleske

1
Tôi lấy một gợi ý từ chính git (cụ thể là git hook) và sử dụng .samplehậu tố. Vì vậy, trong trường hợp của bạndefault_values.txt.sample
tir38

5

Hãy nhìn vào smudge / sạch kịch bản. Bằng cách này, bạn có thể kiểm soát phiên bản tệp nhưng khi được kiểm tra, bạn sẽ "làm nhòe" nó bằng cách thay thế dữ liệu chung / giữ chỗ bằng dữ liệu cụ thể của máy trong tệp.

Khi bạn cam kết, bạn sẽ "dọn dẹp" nó bằng cách thay thế thông tin cụ thể của máy bằng thông tin chung hoặc giữ chỗ.

Các kịch bản smudge / clean phải có tính xác định trong việc áp dụng chúng nhiều lần, theo các thứ tự khác nhau sẽ tương đương với việc chỉ chạy cái cuối cùng trong chuỗi.

Điều tương tự có thể được áp dụng với mật khẩu nếu bạn cần để lộ kho lưu trữ của mình nhưng nội dung có thể chứa thông tin nhạy cảm.


Các kịch bản Clean và Smudge có phải là cục bộ hoặc một phần của repo không?
Alan

Đúng. :) ... đó là, bạn có thể chia sẻ smudge sạch thông qua repo nhưng không phải là ý hay khi chúng chứa dữ liệu nhạy cảm như mật khẩu sản xuất. Nếu đó không phải là vấn đề đáng lo ngại, git yêu cầu bạn kích hoạt tập lệnh một cách rõ ràng. Nếu không, mọi người có thể làm những điều độc hại thông qua github và các repos được chia sẻ khác cho những người dùng khác.
Adam Dymitruk

Tôi cần đọc thêm một chút về điều này. Về cơ bản tôi muốn thiết lập một dự án có mặc định user.jsoncần được ghi đè bằng tín dụng của mỗi nhà phát triển, nhưng tôi không muốn nhà phát triển vô tình kiểm tra tín dụng của họ.
Alan

Tôi sẽ google xung quanh cho các kịch bản ví dụ smudge sạch. Xem những gì đi lên. Ngoài ra, nhảy vào phòng git irc trên freenode. Bạn sẽ nhận được sự giúp đỡ ngay lập tức.
Adam Dymitruk

3

Tôi đã giải quyết vấn đề này bằng cách xác định bộ lọc "sạch" để đơn giản hóa nội dung của tệp trong chỉ mục.

git show :path/to/myfile chỉ nên in nội dung của chỉ mục cho tệp đã chỉ định, vì vậy chúng ta có thể sử dụng nội dung đó trong tập lệnh để thay thế bản sao làm việc bằng bản sao chưa được chỉnh sửa trong chỉ mục:

#! /bin/sh

git show :$1

Đặt bộ lọc đó làm bộ lọc "sạch" cho tệp có liên quan (giả sử bạn đã đặt bộ lọc đó vào "Discard_changes"):

$ git config filter.ignore_myfile.clean "discard_changes path/to/myfile"
$ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes

Thật không may, tôi không thể tìm ra cách để biến điều này thành chung cho nhiều tệp, vì không có cách nào để biết tệp nào chúng tôi đang xử lý từ bên trong tập lệnh sạch. Tất nhiên, không có gì ngăn bạn thêm quy tắc lọc khác nhau cho mỗi tệp, nhưng điều đó hơi khó hiểu.


1

Tôi tìm thấy một giải pháp làm việc cho nhóm của tôi. Chúng tôi chia sẻ githook của chúng tôi thông qua các liên kết tượng trưng và sau khi thêm tệp mẫu vào git, tôi đã thêm một hook hook trước để kiểm tra xem tệp mẫu đã được sửa đổi chưa và nếu vậy tôi git reset -- templatefile.txt. Nếu đó là tập tin thay đổi duy nhất, tôi cũng hủy bỏ cam kết.


-1

Tôi đề nghị nhìn vào mô hình con. Nếu bạn đặt các tệp cụ thể của máy trong một mô hình con, git add sẽ bỏ qua nó.


Đây là một ý tưởng tốt, nhưng sau đó tôi cũng phải đặt kho lưu trữ tệp duy nhất trên máy chủ git, điều này không tối ưu, chỉ vì chúng tôi đang sử dụng github và có số lượng kho lưu trữ hạn chế.
Marc

@Marc hãy xem Visual Studio Team Services, các dự án tư nhân miễn phí không giới hạn và kho git. Bảng Kanban, mục công việc và theo dõi lỗi, liên kết đăng ký với các mục công việc, quản lý chạy nước rút nếu bạn vào scrum hoặc các loại dự án khác. Cũng như nó có các công cụ xây dựng tuyệt vời để xây dựng dựa trên nhiều nền tảng, quá nhiều thứ để đề cập là tất cả đều miễn phí. Một số người xỉa nó vì Microsoft của nó nhưng nó xử lý những gì github cung cấp về các công cụ ngoài việc lưu trữ kho lưu trữ. Có những giới hạn về những gì bạn có thể làm miễn phí nhưng tôi hiếm khi vượt quá chúng.
Aran Mulholland

@Marc một điều nữa mà tôi thấy thực sự tiện dụng về nó là tôi có thể thiết lập nhiều tài khoản như tôi muốn, vì vậy nếu tôi đang viết một dự án cho một khách hàng muốn sở hữu kiểm soát nguồn tôi có thể tạo một tài khoản, hãy sử dụng nó để lập kế hoạch, thiết kế và thực hiện dự án và khi tôi hoàn thành, tôi có thể chuyển quyền sở hữu tài khoản cho khách hàng.
Aran Mulholland
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.