Bỏ qua .classpath và .project khỏi Git


77

Tôi luôn nói với tôi và những người khác không sử dụng các tệp .classpath và .project và sử dụng Maven.

Bằng cách nào đó, các nhà phát triển Junior luôn bỏ qua các quy tắc nhất định và cam kết các tệp đó và tốt hơn nhiều là có các tệp như vậy cho người mới có thể nhảy và bắt đầu sử dụng mã.

Bây giờ từ góc độ của tôi, tôi muốn thử / làm điều gì đó. Khi tôi sao chép repo, tôi sẽ nhận được các tệp .classpath và .project và chắc chắn chúng sẽ được sửa đổi trong hệ thống của tôi.

Nhưng tôi muốn chúng không được cam kết và luôn nên được bỏ qua trong khi đồng bộ hóa với Git. Để các thay đổi của tôi trong hệ thống cục bộ không làm xáo trộn Git và các thay đổi Git của các tệp đó không làm rối các tệp cục bộ của tôi.

Làm cách nào để đạt được điều này? Dù sao để đánh dấu những tập tin được bỏ qua theo cách như vậy?


Tôi là một Java n00b hoàn chỉnh, nhưng theo tài liệu Eclipse, những tệp đó nên được lưu trữ trong kiểm soát phiên bản. wiki.eclipse.org/…
Daniel Schilling

Câu trả lời:


119

Nếu .project.classpathđã được cam kết, thì chúng cần được xóa khỏi chỉ mục (nhưng không phải đĩa)

git rm --cached .project
git rm --cached .classpath

Sau đó, .gitignoretệp sẽ hoạt động (và tệp đó có thể được thêm vào và chia sẻ thông qua các bản sao).
Ví dụ, gitignore.io/api/eclipsetệp này sau đó sẽ hoạt động, bao gồm:

# Eclipse Core      
.project

# JDT-specific (Eclipse Java Development Tools)     
.classpath

Lưu ý rằng bạn có thể sử dụng " Thư mục Mẫu " khi sao chép (đảm bảo rằng người dùng của bạn có một biến môi trường $GIT_TEMPLATE_DIRđược đặt thành một thư mục chia sẻ mà tất cả mọi người đều có thể truy cập được).
Thư mục mẫu đó có thể chứa một info/excludetệp, với các quy tắc bỏ qua mà bạn muốn thực thi cho tất cả các kho lưu trữ, bao gồm cả các kho lưu trữ mới ( git init) mà bất kỳ người dùng nào cũng sẽ sử dụng.


Như nhận xét của Abdollah

Khi bạn thay đổi chỉ mục, bạn cần phải cam kết thay đổi và đẩy nó.
Sau đó, tệp được xóa khỏi kho lưu trữ. Vì vậy, người mới không thể kiểm tra các tệp .classpath.projecttừ repo.


Khi bạn thay đổi chỉ mục, bạn cần phải cam kết thay đổi và đẩy nó. Sau đó, tệp được xóa khỏi kho lưu trữ. Vì vậy, người mới không thể kiểm tra các tệp .classpath và .project từ repo.
Abdollah

1
@Abdollah Điểm tốt. Tôi đã bao gồm bình luận của bạn trong câu trả lời để hiển thị nhiều hơn.
VonC

@Abdollah Tại sao? Khi quá trình xóa được cam kết và đẩy (cũng như .gitignore), bạn sẽ không thể dễ dàng thêm lại các tệp đó.
VonC

PO muốn .classpath và .project vẫn còn trên repo. Có thể sử dụng SKIP-WORKTREE cho tình huống như vậy là một lựa chọn tốt hơn. Tôi đã giải thích nó ở đây . @VonC Rất tiếc, tôi đã xóa nhận xét trước đó của mình nói rằng "không có giải pháp nào trong git cho tình huống như vậy" vài phút sau khi viết nó và tôi không thấy phản hồi của bạn khi xóa nó.
Abdollah

11

Thêm các dòng dưới đây trong .gitignore và đặt tệp bên trong thư mục dự án của bạn

/target/
/.classpath
/*.project
/.settings
/*.springBeans

Vui lòng giải thích những gì bạn đã làm khi chỉnh sửa câu trả lời của mình, chỉ tránh mã aswer
GGO

1
Tôi chưa thấy ai trả lời câu hỏi này, họ chỉ đưa ra một số liên kết để tham khảo.
Viyaan Jhiingade ngày

2
Tôi nghĩ câu trả lời này là siêu gan. Tôi biết tất cả các khái niệm nhưng chỉ muốn có mã chính xác để đưa vào tệp .gitignore. Cảm ơn bạn @ViyaanJhiingade Và chào mừng bạn đến với StackOverflow.
Saurabh Patil

5

Giải pháp git cho các tình huống như vậy là đặt SKIP-WORKTREE BIT . Chỉ chạy lệnh sau:

git update-index --skip-worktree .classpath .gitignore

Nó được sử dụng khi bạn muốn git bỏ qua các thay đổi của các tệp đã được git quản lý và tồn tại trên chỉ mục . Đây là trường hợp sử dụng phổ biến cho các tệp cấu hình .

Chạy git rm --cachedkhông hoạt động cho tình huống được đề cập trong câu hỏi. Nếu tôi đơn giản hóa câu hỏi, nó nói:

Làm thế nào để có .classpath.projecttrên repo trong khi mỗi cái có thể thay đổi cục bộ và git bỏ qua thay đổi này?

Như tôi đã nhận xét dưới câu trả lời được chấp nhận, nhược điểm của git rm --cachednó là nó gây ra sự thay đổi trong chỉ mục, vì vậy bạn cần phải cam kết thay đổi và sau đó đẩy nó vào kho lưu trữ từ xa. Do đó, .classpath.projectsẽ không có sẵn trên repo trong khi PO muốn chúng ở đó để bất kỳ ai sao chép repo lần đầu tiên, họ đều có thể sử dụng nó.

SKIP-WORKTREE BIT là gì?

Dựa trên git documentaion:

Bit Skip-worktree có thể được định nghĩa trong một câu (dài): Khi đọc một mục nhập, nếu nó được đánh dấu là bỏ qua-worktree, thì Git giả vờ rằng phiên bản thư mục làm việc của nó đã được cập nhật và thay vào đó hãy đọc phiên bản chỉ mục. Mặc dù bit này trông giống với bit giả định không thay đổi , nhưng mục tiêu của nó khác với bit giả định không thay đổi. Skip-worktree cũng được ưu tiên hơn bit giả định không thay đổi khi cả hai được thiết lập.

Thông tin chi tiết có tại đây .


1
Trên thực tế, tôi đã viết về nó ở đây: stackoverflow.com/a/23806990/6309
VonC

So sánh tuyệt vời.
Abdollah

2
Đây phải là câu trả lời mới được chấp nhận, bởi vì nó là cách duy nhất để giữ các tệp được cam kết git và bỏ qua chúng cho các cam kết mới.
IVleafclover

1

Sử dụng tệp .gitignore. Điều này cho phép bạn bỏ qua một số tệp nhất định. http://git-scm.com/docs/gitignore

Đây là ví dụ về Eclipse, xử lý đường dẫn classpath và tệp dự án của bạn: https://github.com/github/gitignore/blob/master/Global/Eclipse.gitignore


Tôi đã sử dụng .gitignore. Điều này có thể áp dụng nếu tôi đang cam kết hoặc tạo repo mới từ địa phương của tôi. Nếu bạn đang sao chép repo, tôi đoán .gitignore sẽ không hoạt động, nó sẽ tìm nạp tệp .project và bất kỳ thay đổi nào sẽ không đồng bộ
Reddy

2
Bạn cần gửi của bạn .gitignoređến repo để mọi người sử dụng nó. Bằng cách đó, không ai phải gửi các tệp đó. .classpath và .project không bao giờ có trong repo.
olan

1
những gì về các tệp / kho lưu trữ hiện có chứa các tệp đó?
Reddy

1
bạn có thể nhanh chóng xác nhận nghi ngờ của tôi về .ignore. ^ Nhận xét trên
Reddy

1
Tôi không thấy .classpath hoặc .project bỏ qua trong tệp đó? Tui bỏ lỡ điều gì vậy? (File .project tôi sẽ không biến mất mặc dù tôi đã có một dòng cho điều này trong gitignore của tôi)
Matthew khôn ngoan
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.