Đánh dấu tập tin là không phổ biến trên mạng với Git


41

Tôi muốn thể hiện một số công việc của mình bằng cách tải chúng lên tài khoản GitHub của tôi. Tuy nhiên, có một số tệp chứa mật khẩu, như kết nối cơ sở dữ liệu.

Có cách nào đánh dấu một tệp là không phù hợp với Git để nó không thể xuất hiện trên GitHub không?


1
Gợi ý tiếp tuyến: Điều này có thể không áp dụng được trên mọi nền tảng, vì một số người đã kết hôn với các tệp cấu hình, nhưng bạn có thể xem xét theo phương pháp 12factor để giữ các tham số này trong môi trường: 12factor.net/config . Đó là, có mã ứng dụng không bao giờ giả sử sự hiện diện của một tệp cấu hình. (Trái ngược với tập lệnh khởi động riêng đặt các tập lệnh này, nhưng không bao giờ rời khỏi máy cục bộ của bạn.)
millimoose

1
Nếu bạn vô tình cam kết chúng, hãy đảm bảo bạn xóa chúng khỏi lịch sử git đầy đủ (các câu hỏi khác sẽ giải thích như thế nào) bởi vì ngay cả khi bạn xóa và bỏ qua nó, phiên bản cam kết cũ sẽ vẫn còn trong lịch sử và hiển thị trên Github.
tò mò

3
Lưu ý rằng tất cả các câu trả lời không thực sự trả lời câu hỏi của bạn. Họ không làm cho tập tin không thể thực hiện được, họ chỉ cần cấu hình git để mặc định nó bỏ qua nó. Nhưng nếu bạn vô tình chèn tên tệp đó vào một dòng lệnh git, bạn có thể kết thúc nó ngay cả khi nó khớp với một mẫu trong đó .gitignore. AFAIK không có cách nói đầy đủ 100% gitđể tránh cam kết một tệp cụ thể trong mọi trường hợp. Mặc dù điều này có thể được coi là một tính năng ... cho phép các lệnh rõ ràng ghi đè lên các cấu hình chung.
Bakuriu

Bạn có thể xóa mật khẩu được mã hóa cứng và chuyển sang một giải pháp thay thế an toàn hơn. Sau đó, bạn có thể chuyển đổi mật khẩu cơ sở dữ liệu. Các mật khẩu cũ vẫn còn trong các cam kết nhưng chúng đã lỗi thời một khi ai đó có thể đọc được chúng. Tôi khá chắc chắn rằng bạn không thể thay đổi một cam kết một khi nó đã được xây dựng.
BlueWizard

3
Ngoài những gì @cquildannii đã nói, GitHub có toàn bộ trang thảo luận về cách xóa dữ liệu nhạy cảm mà bạn vô tình phạm phải. Trong số những thứ khác, trang này nói để thay đổi bất kỳ mật khẩu và khóa bạn vô tình xuất bản. help.github.com/articles/remove-sensitive-data
Kevin - Tái lập Monica

Câu trả lời:


67

Có cách nào đánh dấu một tệp là không phù hợp với Git để nó không thể xuất hiện trên GitHub không?

Đầu tiên, không có cách nào để có một số tệp và cam kết hiển thị trong kho Git cục bộ của bạn nhưng bằng cách nào đó không thể xem được trong GitHub; nếu bạn có một tệp được cam kết trong Git, nó sẽ hiển thị trong GitHub.

Thứ hai, không có cách nào đơn giản và thực tế để tự đánh dấu một tệp riêng lẻ là không phổ biến. Nhưng Nhưng chắc chắn có một cách để bỏ qua một tệp trong repo Git: Bằng cách thêm (các) tệp vào trong đường dẫn tương đối của chúng nếu cần thiết cho một .gitignoretập tin :

Một .gitignoretệp chỉ định các tệp không được theo dõi có chủ ý mà Git nên bỏ qua. Các tệp đã được theo dõi bởi Git không bị ảnh hưởng; xem các ghi chú bên dưới để biết chi tiết.

Tạo một cơ bản .gitignorelà khá dễ dàng vì nó chỉ là một tệp văn bản đơn giản. Vì vậy, ví dụ, nếu tôi có một config.phptập tin trong thư mục gốc, bạn sẽ làm điều này; giả sử bạn đang sử dụng PHP nhưng khái niệm này áp dụng cho mọi thiết lập. Ngoài ra, tôi đang sử dụng Nano làm trình soạn thảo văn bản của mình trong ví dụ này nhưng vui lòng sử dụng bất kỳ trình soạn thảo văn bản nào bạn thường sử dụng cho việc này:

nano .gitignore

Và chỉ cần thêm tên tệp đó vào tập tin đó:

config.php

Lưu nó và bây giờ Git sẽ đơn giản bỏ qua tập tin đó.

Điều đó nói rằng, những gì tôi muốn làm cho các thiết lập như thế này là giữ một cấu hình mẫu / ví dụ được đặt ở giữa các chi tiết nhạy cảm trong kho lưu trữ để tôi có một số tài liệu tham khảo về định dạng tệp cấu hình là một tệp có tên như thế này:

config.SAMPLE.php

Bằng cách đó, bạn biết chính xác cách config.phptệp sẽ được thiết lập thông qua config.SAMPLE.phpvà bạn có thể đảm bảo rằng thực tế config.phpkhông bao giờ bị Git chạm vào.

Ngoài ra, nếu bạn có kế hoạch hiển thị mã của mình, bạn cần phải hy vọng rằng ai đó sẽ cố gắng lấy mã đó và thực hiện nó trên hệ thống của riêng họ theo một cách nào đó. Hãy nhớ rằng, chúng tôi không phải là bạn và không có tệp cấu hình mẫu trong repo của bạn, mọi người sẽ không thực sự hiểu cách tự thực hiện mã. Họ thậm chí có thể nghĩ rằng bạn không đủ năng lực vì bạn không cung cấp một ví dụ cấu hình cơ bản.


11
+1 cho câu trả lời đúng đề xuất một tệp cấu hình mẫu. Có một số thư viện như Figaro cho Ruby, loại đó thúc đẩy bạn theo hướng này. Bạn nên có một tệp mẫu được cam kết với các giá trị tương tự như các giá trị thực để người nhìn vào mã của bạn biết môi trường sẽ trông như thế nào. Một số nền tảng, như Heroku, sử dụng các biến môi trường, vì vậy bạn có thể đặt cấu hình của mình thành một cái gì đó như database_url = Environment.DATABASE_URLvà để lại nhận xét ở trên như thế nào # postgres://username:password@localhost/dbname.
Chris Cirefice

@ChrisCirefice Cảm ơn! Luôn luôn làm tôi ngạc nhiên rằng các công cụ mới trên mạng của Google xuất hiện sẽ nhắc nhở bạn về điều hiển nhiên: Nếu mã này sẽ được người khác đọc, không giải thích cách cấu hình hoạt động chính xác thì sao? Cảm ơn một lần nữa.
JakeGould

27

Bạn cũng có thể thêm một hook hook trước để thực hiện kiểm tra độ tỉnh táo. Thư mục .git/hookscủa mỗi kho git có một số tập lệnh mẫu.

Tập lệnh được gọi pre-commitđược thực thi nếu nó tồn tại trước mỗi lần xác nhận và giá trị trả về khác không hủy bỏ cam kết.

Ví dụ: bạn có thể có một tập lệnh đơn giản như thế này:

#! /bin/sh -e
git ls-files --cached | grep -qx 'filename' && { echo "Excluded file included in the commit" >&2; exit 1; }
exit 0

Và nếu điều đó filenamephù hợp, cam kết thất bại.


1
+1 đây là câu trả lời đúng thực sự ngăn chặn việc thêm và cam kết rõ ràng vào tệp.
R ..

Thật vậy, mặc dù thực hành được khuyến nghị không nên dựa vào việc có biện pháp phòng ngừa này (ví dụ sử dụng `.gitignore).
David Z

2
@R .. Có và không. Trong khi câu hỏi nêu ra, thì việc đánh dấu một tập tin là không thể tin được, tinh thần là một cách ngăn chặn một tập tin .gitignore. Nhưng một tập lệnh cam kết trước không thực sự được sử dụng bởi hầu hết người dùng Git. Nó đòi hỏi một số kiến ​​thức về thiết lập và nó đòi hỏi một số lý do thực sự tại sao một phương pháp như thế này lại thích hợp hơn là chỉ sử dụng một .gitignoretệp. Nhưng điều này rất hữu ích cho một số trường hợp phức tạp hơn, nhưng đó chắc chắn là một khái niệm bạn sẽ sử dụng khi bạn thực sự biết bạn cần sử dụng nó.
JakeGould

2
Tôi có thể thấy việc sử dụng điều này trong các tình huống mà bạn có thể không tin tưởng 100% .gitignore (bạn có thể làm điều gì đó dại dột vô tình yêu cầu git thêm tệp để gửi). Hoặc có lẽ người khác có thể chỉnh sửa tệp .gitignore (rốt cuộc, nó nằm dưới sự kiểm soát phiên bản). Nếu bạn thực sự cần một quy trình có thể kiểm tra thì đây là thứ bạn có thể làm việc trong quy trình đó.
Cort Ammon

@CortAmmon không phải lúc nào cũng là về niềm tin. Bạn có thể thêm một số thông tin gỡ lỗi tạm thờikhông công khai vào mã nguồn của mình mà bạn không muốn cam kết nhưng bạn không thể bỏ qua tệp đó. Thay vào đó, bạn muốn kiểm tra nó trước khi cam kết nếu nó không chứa bất cứ điều gì bất hợp pháp . Đây có vẻ là một giải pháp tốt cho trường hợp sử dụng này. Và như một thước đo thực tế, đây là cách tôi tìm thấy câu hỏi này vì đó là trường hợp sử dụng của tôi.
t3chb0t

12

Những gì @JakeGould nói. Trong một số trường hợp, bạn cũng có thể sử dụng các bit tệp đặc biệt như skip-worktreehoặc assume-unchangedcó thể được đặt theo cách sau; để biết sự khác biệt giữa hai loại này, hãy xem câu trả lời Stack Overflow này :

git update-index --assume-unchanged <file>

Sau đó sẽ ẩn các thay đổi bổ sung cho một tệp đã có và bạn có thể sử dụng nếu bạn thực sự muốn có một tệp ở đó sau mỗi lần kéo. Nhưng tôi sẽ khuyên bạn chỉ sử dụng nó nếu bạn thực sự biết những gì bạn đang làm.


8

Sử dụng .gitignorenhư @JakeGould nói. Ngoài ra, một số thông tin liên quan:

  • .gitignoregiữ cho các tập tin khỏi bị theo dõi; nếu chúng đã được theo dõi sử dụng git rm --cachedđể loại bỏ chúng
  • tập tin / mẫu trong $GIT_DIR/info/excludecũng sẽ bị bỏ qua
  • các tệp / mẫu trong tệp được chỉ định bởi core.excludesFile trong người dùng ~/.gitconfigcũng bị bỏ qua.

Xem tài liệu chính thức của Git để biết thêm chi tiết.


2

Để mở rộng câu trả lời của Jake và 46: một cách rất hay là có một tiện ích mở rộng nhất quán bạn sử dụng cho các tệp bạn bao gồm thông tin cá nhân và sử dụng .gitignoređể luôn loại trừ các tệp có tiện ích mở rộng đó trên toàn cầu (sử dụng .gitconfigtệp như được đề cập ở nơi khác để luôn bị bỏ qua cho người dùng của bạn).

Bằng cách đó, bạn có thể có ví dụ:

/projectname/mypasswords.exc 

và nếu bạn đã loại trừ *.exctrên toàn cầu, thì bạn biết rằng nó sẽ không được cam kết, ngay cả khi bạn quên loại trừ riêng lẻ tệp cụ thể đó.

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.