ทำเครื่องหมายไฟล์ว่า“ ไม่น่าเชื่อ” กับ Git


41

ฉันต้องการแสดงผลงานบางส่วนของฉันด้วยการอัปโหลดไปยังบัญชี GitHub ของฉัน อย่างไรก็ตามมีไฟล์บางไฟล์ที่มีรหัสผ่านเช่นการเชื่อมต่อฐานข้อมูล

มีวิธีการทำเครื่องหมายไฟล์ว่าไม่น่าเชื่อถือกับ Git หรือไม่เพื่อให้ไม่สามารถปรากฏบน GitHub ได้?


1
ข้อเสนอแนะของวงนี้อาจใช้ไม่ได้กับทุกแพลตฟอร์มตั้งแต่บางแต่งงานมากแฟ้มการกำหนดค่า แต่คุณอาจจะพิจารณาต่อไปนี้วิธีการของการรักษา 12factor พารามิเตอร์เหล่านี้ในสภาพแวดล้อม: 12factor.net/config นั่นคือให้รหัสแอปพลิเคชันไม่เคยสมมติว่ามีไฟล์การกำหนดค่า (ตรงข้ามกับสคริปต์เริ่มต้นส่วนบุคคลที่ตั้งค่าสิ่งเหล่านี้ แต่ไม่เคยออกจากเครื่องท้องถิ่นของคุณ)
millimoose

1
หากคุณตั้งใจกระทำให้แน่ใจว่าคุณลบพวกเขาออกจากประวัติคอมไพล์อย่างสมบูรณ์ (คำถามอื่น ๆ จะอธิบายวิธีการ) เพราะแม้ว่าคุณจะลบและเพิกเฉยมันเวอร์ชันเก่ามุ่งมั่นจะยังคงอยู่ในประวัติศาสตร์และสามารถมองเห็นได้บน Github
อยากรู้อยากเห็น dannii

3
โปรดทราบว่าคำตอบทั้งหมดไม่ได้ตอบคำถามของคุณ พวกเขาไม่ได้ทำให้ไฟล์ผิดปกติพวกเขาเพียงแค่กำหนดค่าคอมไพล์เพื่อให้มันละเว้นโดยค่าเริ่มต้น แต่ถ้าคุณตั้งใจใส่ชื่อไฟล์ที่เป็นบรรทัดคำสั่งคอมไพล์คุณสามารถจบลง commiting .gitignoreมันแม้ว่ามันจะตรงกับรูปแบบใน AFAIK ไม่มีวิธีการพิสูจน์แบบเต็ม 100% ในการบอกgitให้หลีกเลี่ยงการรับไฟล์เฉพาะในทุกกรณี แม้ว่าสิ่งนี้อาจถูกมองว่าเป็นคุณสมบัติ ... ทำให้คำสั่งที่ชัดเจนสามารถแทนที่การกำหนดค่าทั่วไป
Bakuriu

คุณสามารถลบรหัสผ่านที่ฮาร์ดโค้ดแล้วเปลี่ยนเป็นทางเลือกที่ปลอดภัยกว่า หลังจากนั้นคุณสามารถสลับรหัสผ่านฐานข้อมูล รหัสผ่านเก่ายังคงอยู่ในคอมมิชชัน แต่พวกเขาจะล้าสมัยเมื่อมีคนที่สามารถอ่านได้ ฉันค่อนข้างแน่ใจว่าคุณไม่สามารถเปลี่ยนการมอบหมายได้เมื่อมันสร้างต่อไป
BlueWizard

3
นอกเหนือจากสิ่งที่ @curiousdannii พูดแล้ว GitHub ยังมีหน้าเว็บทั้งหมดที่กล่าวถึงวิธีการลบข้อมูลที่สำคัญที่คุณได้กระทำโดยไม่ได้ตั้งใจ เหนือสิ่งอื่นใดหน้านี้บอกว่าจะเปลี่ยนรหัสผ่านและกุญแจใด ๆ ที่คุณเผยแพร่โดยไม่ตั้งใจ help.github.com/articles/remove-sensitive-data
Kevin - Reinstate Monica

คำตอบ:


67

มีวิธีการทำเครื่องหมายไฟล์ว่าไม่น่าเชื่อถือกับ Git หรือไม่เพื่อให้ไม่สามารถปรากฏบน GitHub ได้?

อันดับแรกไม่มีวิธีที่จะมีไฟล์บางไฟล์และคอมมิทสามารถมองเห็นได้ในที่เก็บ Git ในพื้นที่ของคุณ แต่ไม่สามารถดูได้ใน GitHub หากคุณมีไฟล์ที่คอมมิทใน Git ไฟล์นั้นจะปรากฏใน GitHub

ประการที่สองไม่มีที่เรียบง่ายและวิธีการปฏิบัติที่เคยทำเครื่องหมายแฟ้มแต่ละตัวเองว่าเป็น แต่มี“uncommitable.” แน่นอนวิธีที่จะไม่สนใจไฟล์ใน Git เป็น Repo: โดยการเพิ่มไฟล์ (s) -including ทางญาติของพวกเขาหาก จำเป็น - สำหรับ.gitignoreไฟล์ :

.gitignoreไฟล์ระบุไฟล์ที่ไม่ได้ติดตามว่าเจตนา Git ควรละเลย ไฟล์ที่ถูกติดตามโดย Git แล้วจะไม่ได้รับผลกระทบ ดูหมายเหตุด้านล่างสำหรับรายละเอียด

การสร้างพื้นฐาน.gitignoreค่อนข้างง่ายเนื่องจากเป็นเพียงไฟล์ข้อความธรรมดา ตัวอย่างเช่น - ถ้าฉันมีconfig.phpไฟล์อยู่ในรูทของคุณคุณต้องทำสิ่งนี้ สมมติว่าคุณใช้ PHP แต่แนวคิดนี้มีผลกับการตั้งค่าใด ๆ นอกจากนี้ฉันกำลังใช้นาโนเป็นตัวแก้ไขข้อความของฉันในตัวอย่างนี้ แต่อย่าลังเลที่จะใช้ตัวแก้ไขข้อความใด ๆ ที่คุณใช้ตามปกติสำหรับสิ่งนี้:

nano .gitignore

และเพิ่มชื่อไฟล์นั้นลงในไฟล์นั้น:

config.php

บันทึกและตอนนี้ Git จะไม่สนใจไฟล์นั้น

ที่กล่าวว่าสิ่งที่ฉันต้องการจะทำสำหรับการตั้งค่าเช่นนี้คือการเก็บตัวอย่าง / ตัวอย่างการกำหนดค่า neutered ของข้อมูลจำเพาะที่ละเอียดอ่อนในที่เก็บดังนั้นฉันมีการอ้างอิงบางอย่างเกี่ยวกับสิ่งที่รูปแบบไฟล์ config เป็นไฟล์ชื่อดังนี้

config.SAMPLE.php

ด้วยวิธีนี้คุณจะรู้ได้อย่างชัดเจนว่าconfig.phpไฟล์ควรถูกติดตั้งอย่างไรconfig.SAMPLE.phpและคุณสามารถมั่นใจได้ว่าconfig.phpGit นั้นจะไม่ถูกสัมผัส

นอกจากนี้หากคุณวางแผนที่จะแสดงรหัสของคุณคุณต้องคาดหวังว่าจะมีคนพยายามที่จะนำรหัสนั้นมาใช้และนำไปใช้กับระบบของตัวเองในบางวิธี โปรดจำไว้ว่าเราไม่ใช่คุณและหากไม่มีไฟล์กำหนดค่าตัวอย่างใน repo ของคุณผู้ใช้จะไม่เข้าใจวิธีการติดตั้งโค้ดด้วยตนเอง Heck พวกเขาอาจคิดว่าคุณไม่เก่งเพราะคุณไม่ได้ให้ตัวอย่างการตั้งค่าพื้นฐาน


11
+1 สำหรับคำตอบที่ถูกต้องและแนะนำไฟล์การกำหนดค่าตัวอย่าง มีห้องสมุดบางอย่างเช่นฟิกาโร่รูบีซึ่งจะผลักดันคุณไปในทิศทางนี้ คุณควรมีไฟล์ตัวอย่างที่คอมมิทด้วยค่าที่คล้ายกับค่าจริงเพื่อให้ผู้ที่ดูโค้ดของคุณรู้ว่าสภาพแวดล้อมควรเป็นอย่างไร บางแพลตฟอร์มเช่น Heroku ตัวแปรสภาพแวดล้อมการใช้งานดังนั้นคุณอาจตั้งค่าการกำหนดค่าของคุณเพื่อสิ่งเช่นและออกความคิดเห็นข้างต้นเช่นdatabase_url = Environment.DATABASE_URL # postgres://username:password@localhost/dbname
Chris Cirefice

@ChrisCirefice ขอบคุณ! ทำให้ฉันประหลาดใจอยู่เสมอว่า "เครื่องมือ" ใหม่ ๆ ที่ควรเตือนคุณถึงสิ่งที่ชัดเจน: หากคนอื่นอ่านโค้ดนี้จะไม่อธิบายว่า config ทำงานอย่างไร ขอบคุณอีกครั้ง.
JakeGould

27

นอกจากนี้คุณยังสามารถเพิ่มเบ็ดที่ผูกมัดไว้ล่วงหน้าเพื่อใช้การตรวจสุขภาพ ไดเรกทอรี.git/hooksของที่เก็บ git ทุกตัวมีตัวอย่างสคริปต์บางส่วน

สคริปต์ที่เรียกใช้pre-commitจะถูกดำเนินการหากมีอยู่ก่อนการส่งมอบแต่ละครั้งและค่าส่งคืนที่ไม่เป็นศูนย์จะยกเลิกการส่งมอบ

ตัวอย่างเช่นคุณอาจมีสคริปต์แบบง่าย ๆ ดังนี้:

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

และถ้าfilenameตรงกับที่กระทำผิดพลาด


1
+1 นี่คือคำตอบที่ถูกต้องที่ป้องกันการเพิ่ม & กระทำไฟล์อย่างชัดเจน
..

ถึงแม้ว่าการปฏิบัติที่แนะนำไม่ควรพึ่งพาการป้องกันนี้ในสถานที่ (เช่นใช้ `.gitignore แทน)
David Z

2
@R .. ใช่และไม่ใช่ ในขณะที่คำถามระบุว่า "การทำเครื่องหมายไฟล์ว่าเป็นเรื่องธรรมดา" จิตวิญญาณก็คือ "การป้องกันไฟล์ไม่ให้มีความมุ่งมั่น" ความจริงก็คือการสร้าง .gitignoreเป็นเรื่องธรรมดามาก - และเป็นที่เข้าใจกันทั่วไป แต่สคริปต์ก่อนการคอมมิตไม่ได้ใช้จริงโดยผู้ใช้ส่วนใหญ่ของ Git มันต้องมีความรู้เกี่ยวกับการตั้งค่าและต้องการเหตุผลที่แท้จริงว่าทำไมวิธีการเช่นนี้จะดีกว่าการใช้.gitignoreไฟล์ แต่สิ่งนี้มีประโยชน์มากสำหรับกรณีที่ซับซ้อนมากขึ้น แต่เป็นแนวคิดที่คุณจะใช้เมื่อคุณรู้ว่าคุณจำเป็นต้องใช้
JakeGould

2
ฉันเห็นการใช้สิ่งนี้ในสถานการณ์ที่คุณอาจไม่เชื่อถือ 100%. gitignore (คุณอาจทำสิ่งที่โง่เขลาโดยไม่ได้ตั้งใจต้องการคอมไพล์เพิ่มไฟล์สำหรับ comitting) หรือบางทีคนอื่นอาจแก้ไขไฟล์. gitignore (อยู่ภายใต้การควบคุมเวอร์ชันหลังจากทั้งหมด) หากคุณต้องการกระบวนการที่สามารถทดสอบได้จริง ๆ นี่เป็นสิ่งที่คุณสามารถใช้ในกระบวนการดังกล่าวได้
Cort Ammon

@CortAmmon มันไม่ได้เกี่ยวกับความไว้วางใจเสมอไป คุณสามารถเพิ่มข้อมูลการดีบักชั่วคราวและไม่ใช่ข้อมูลสาธารณะลงในซอร์สโค้ดของคุณซึ่งคุณไม่ต้องการส่งมอบ แต่คุณไม่สามารถเพิกเฉยต่อไฟล์ดังกล่าวได้ แต่คุณต้องการตรวจสอบก่อนที่จะ commiting ถ้ามันไม่ได้มีอะไรที่ผิดกฎหมาย นี่เป็นวิธีแก้ปัญหาที่ดีสำหรับกรณีการใช้งานนี้ และตามความจริงแล้วนี่คือวิธีที่ฉันพบคำถามนี้เพราะมันเป็นกรณีการใช้งานของฉัน
t3chb0t

12

@ Jakeake จะพูดอะไร ในบางกรณีคุณสามารถใช้บิตไฟล์พิเศษเช่นskip-worktreeหรือassume-unchangedที่สามารถตั้งค่าวิธีดังต่อไปนี้ สำหรับความแตกต่างระหว่างทั้งสองให้ดูคำตอบ Stack Overflow นี้ :

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

ซึ่งจะซ่อนการเปลี่ยนแปลงเพิ่มเติมของไฟล์ที่มีอยู่แล้วและคุณสามารถใช้ถ้าคุณต้องการให้ไฟล์อยู่ที่นั่นหลังจากดึงทุกครั้ง แต่ฉันจะแนะนำให้คุณใช้เฉพาะเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่


8

ใช้.gitignorelike @JakeGould พูด นอกจากนี้ข้อมูลที่เกี่ยวข้องบางส่วน:

  • .gitignoreป้องกันไม่ให้ไฟล์ถูกติดตาม หากพวกเขาถูกติดตามใช้git rm --cachedเพื่อลบพวกเขา
  • ไฟล์ / รูปแบบใน$GIT_DIR/info/excludeจะถูกละเว้นเช่นกัน
  • ไฟล์ / รูปแบบในไฟล์ที่ระบุโดย core.excludesFile ในผู้ใช้~/.gitconfigจะถูกละเว้นเช่นกัน

ดูเอกสารทางการของ Gitสำหรับรายละเอียดเพิ่มเติม


2

ในการขยายคำตอบของ Jake และ 46: แนวทางปฏิบัติที่ดีอย่างหนึ่งคือการมีนามสกุลที่สอดคล้องกันที่คุณใช้สำหรับไฟล์ที่คุณมีข้อมูลส่วนตัวและใช้.gitignoreเพื่อแยกไฟล์ที่มีนามสกุลนั้นทั่วโลกอยู่เสมอ (การใช้.gitconfigไฟล์ดังกล่าวที่อื่น ๆ สำหรับผู้ใช้ของคุณ)

ด้วยวิธีนี้คุณสามารถมีตัวอย่าง:

/projectname/mypasswords.exc 

และหากคุณยกเว้น*.excทั่วโลกคุณจะรู้ว่ามันจะไม่ถูกส่งถึงแม้ว่าคุณลืมที่จะแยกไฟล์เฉพาะนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.