ไม่สนใจเนื้อหาของไดเรกทอรีที่เช็คอินแล้วใช่ไหม


227

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

ตอนนี้ฉันแค่ต้องการให้โครงสร้างไฟล์แบบลำดับขั้น (แหล่งที่มา) ถูกติดตามโดย git และไดเรกทอรีแบบแบน (เป้าหมาย) (ที่มีไฟล์ทั้งหมดในกองเดียว) ควรถูกละเว้น

ฉันได้เพิ่มไดเรกทอรีเป้าหมายใน. gitignore แต่ git ยังคงติดตามการเปลี่ยนแปลงในนั้น ฉันคิดว่าถ้าฉันยืนยันการลบไฟล์เก่าในไดเรกทอรีเป้าหมาย git อาจหยุดการติดตามเนื้อหาใหม่ (คัดลอกโดยสคริปต์) แต่ก็ไม่ได้

ฉันจะทำให้คอมไพล์ลืมไดเรกทอรีเป้าหมายได้อย่างไร


ชื่อไดเรกทอรีคืออะไรและคุณใส่อะไรใน. gitignore
mmmmmm

1
ชื่อคือ DirNameIrrelevant และใน. gitignore ฉันพยายามใส่ "DirNameIrrelevant", "DirNameIrrelevant /" และ "DirNameIrrelevant / *"
Felixyz

คำตอบ:


524

คำสั่งนี้จะทำให้ git ยกเลิกการติดตามไดเรกทอรีของคุณและไฟล์ทั้งหมดที่อยู่ข้างใต้นั้นโดยไม่ต้องลบทิ้งจริงๆ:

git rm -r --cached <your directory>

-rตัวเลือกที่ทำให้เกิดการกำจัดของไฟล์ทั้งหมดที่อยู่ภายใต้ไดเรกทอรีของคุณ

--cachedตัวเลือกที่เป็นสาเหตุของไฟล์ที่จะถูกลบออกจากดัชนีคอมไพล์ไม่ใช่สำเนาการทำงานของคุณ โดยค่าเริ่มต้นจะลบgit rm <file><file>


อ่าขอบคุณ มีประโยชน์มากแม้ว่าฉันจะไม่เห็นว่าทำไมสิ่งนี้จึงจำเป็น (ทำไมจึงไม่เพียงพอที่จะเพิ่ม dir ใน. gitignore คุณบอกฉันได้ไหมว่า --cache นั้นมีไว้เพื่ออะไร
Felixyz

แน่ใจ ฉันแก้ไขคำตอบเพื่ออธิบายสองตัวเลือก
Gordon Wilson

สำหรับเหตุผลนี้จำเป็นฉันสามารถเก็งกำไรเท่านั้น ฉันเดาว่าผู้สร้างต้องการยกเลิกการติดตามไฟล์อย่างชัดเจนเพื่อลดความเสี่ยงของการยกเลิกการติดตามส่วนสำคัญของโครงการของคุณโดยไม่ตั้งใจ ฉันคิดว่ามันมีเหตุผลทางเทคนิคด้วย
Gordon Wilson

15
gitignore ใช้เพื่อกำหนดว่าไฟล์ git ที่ไม่ได้ติดตามจะต้องทราบ ไม่มีการติดตามไฟล์ที่มีอยู่ หากผู้ใช้ต้องการติดตามไฟล์ที่ถูกข้ามมิฉะนั้น git ช่วยให้พวกเขา สิ่งนี้สามารถทำได้โดยใช้add -fหรือเป็นสถานการณ์ของคุณ ดังที่ Gordon กล่าวว่าสิ่งนี้จะช่วยป้องกันไม่ให้คุณลบไฟล์จำนวนมากออกไปโดยไม่ตั้งใจ - พื้นที่เก็บข้อมูลเป็นรายการหลักไม่ใช่รายการ gitignore นอกจากนี้ยังช่วยให้คุณติดตามสิ่งเล็ก ๆ น้อย ๆ ด้วยตนเองซึ่งจะถูกละเว้นโดยกฎไวด์การ์ดซึ่งเป็นสิ่งที่ฉันพบว่ามีประโยชน์
Cascabel

-rตัวเลือกไม่ได้ที่จะ "ทำให้เกิดการกำจัดของไฟล์ทั้งหมดที่อยู่ภายใต้ไดเรกทอรีของคุณ" แต่จะ recurse ผ่าน subdirs
MrE

78

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

git update-index --assume-unchanged path/to/file.txt

หลังจากที่มีการเปลี่ยนแปลงใด ๆ git statusกับไฟล์นี้จะไม่แสดงใน


1
ในขณะที่ OP อาจขอไดเรคทอรีนี่คือสิ่งที่ฉันกำลังมองหาโดยไม่สนใจการเปลี่ยนแปลงเพิ่มเติมในไฟล์ที่เช็คอินครั้งเดียว ขอบคุณ!
sdaau

1
เพื่อเพิกเฉยไดเรกทอรีใช้ 'git update-index --assume-unchanged dirName / *' ผมใช้เวลาสักครู่เพื่อหาไวยากรณ์ '*' เป็นสิ่งจำเป็นที่นี่
J-Dizzle

1
หนึ่งจะกลับสิ่งนี้ได้อย่างไร
ริส

3
@Rhys เพื่อย้อนกลับ:git update-index --no-assume-unchanged dirname/**/*
JobJob

3

สำหรับไดเรกทอรีย่อยที่เรียกว่าเพิ่มไปยังคอมไพล์ทั้งสองต่อไปนี้ดูเหมือนจะทำงานที่จะไม่สนใจไฟล์ใหม่ในblah/ blah/เพิ่มไปยัง. gignignore:

blah 
blah/*

1

TL; DR เพื่อล้างที่เก็บ git ของคุณและตรวจสอบให้แน่ใจว่ารายการที่ถูกเพิกเฉยของคุณทั้งหมดนั้นถูกเพิกเฉย:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

หมายเหตุ: คุณไม่จำเป็นต้องระบุไดเรกทอรีวิธีนี้คุณจะถูกทำความสะอาดrepo ระยะไกลทั้งหมด

จะไปต่ออ่านนี้


0

ไม่แน่ใจว่าสิ่งนี้นับหรือทำให้ฉันเป็นคนไม่ดี แต่นี่มันไป

  1. ฉันเพิ่ม*Generated*ไปยังไฟล์. gitignore รูท
  2. ฉันส่งไฟล์ที่ฉันต้องการเก็บไว้เป็น GeneratedFile.Whething.ext ตรวจสอบใน
  3. ฉันทำเบ็ดคอมไพล์ในการชำระเงินภายหลังเพื่อเรียกสคริปต์ PowerShell ทำสิ่งนี้:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

ฉันรู้สึกแย่กับตัวเองเล็กน้อย ... แต่มันก็ใช้ได้จริง


-2

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

อย่างน้อยมันก็ใช้ได้กับฉันในสถานการณ์เช่นนี้ จะยังคงดีถ้าใครสามารถให้ข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับสิ่งที่เกิดขึ้น


1
เวอร์ชันย่อของสิ่งที่เราพูดในที่อื่น - gitignore มีผลต่อสิ่งที่ git ข้อมูลที่ไม่ได้ติดตามจะได้รับการรับรู้ ไม่ส่งผลกระทบต่อสิ่งที่จะทำกับข้อมูลที่คุณบอกไว้ (เช่นกำกับให้เพิ่มในที่เก็บ)
Cascabel

ดังนั้นจึงเหมาะสมที่ไฟล์ที่ถูกติดตามและถูกลบไปแล้วควรถูกติดตามเช่นนี้ แต่ก็ยังไม่สมเหตุสมผลกับฉันว่าไฟล์ที่เพิ่ม (ถ้าทำก่อนการส่งครั้งต่อไป) จะถูกติดตามในขณะที่ถ้าฉัน 1) เพิกเฉย, 2) ลบไฟล์, 3) กระทำ, 4) เพิ่มไฟล์ใหม่, ไฟล์ใหม่จะไม่ถูกติดตาม
Felixyz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.