Git ละเว้นโฟลเดอร์ย่อย


438

ฉันมีโครงการจำนวนมากในโซลูชัน. Net ของฉัน ฉันต้องการยกเว้นโฟลเดอร์ "bin / Debug" และ "bin / Release" ทั้งหมด (และเนื้อหา) แต่ยังรวมถึงโฟลเดอร์ "bin" และตัว dll เองที่อยู่ในนั้น

. gitignore ด้วย "bin /" ละเว้น "Debug" และโฟลเดอร์ "Release" แต่ยังรวมถึง dll ที่อยู่ในโฟลเดอร์ "bin" ด้วย

"bin / Debug" หรือ "bin / Release" ในไฟล์. gitignore ไม่ได้ยกเว้นไดเรกทอรีเว้นแต่ว่าฉันมีคุณสมบัติครบถ้วนรูปแบบการเพิกเฉยเป็น "Solution / Project / bin / Debug" - ซึ่งฉันไม่ต้องการทำเช่นฉัน จะต้องรวมรูปแบบเต็มนี้สำหรับแต่ละโครงการในโซลูชันของฉันรวมถึงเพิ่มสำหรับโครงการใหม่ที่เพิ่มเข้ามา

ข้อเสนอแนะใด ๆ


เพิ่ม DLL ทำไม หากคุณกำลังอ้างอิง DLLs ของบุคคลที่สามคุณอาจต้องเพิ่มโฟลเดอร์ทั่วไปที่ทุกโครงการของคุณอ้างอิง
Paddy

6
สิทธิ์ของ Paddy - หากเป็น DLLs ของบุคคลที่สามพวกเขาควรจะจัดระเบียบจากรหัสของคุณ สำหรับฉันแล้วดูเหมือนว่าคุณกำลังตรวจสอบในผลิตภัณฑ์งานสร้างของคุณเองซึ่งโดยทั่วไปไม่ใช่วิธีที่คุณต้องการไป คุณใช้ git เพื่อติดตามข้อมูลซึ่งมีอยู่ในโค้ดและการกำหนดค่าบิวด์อย่างสมบูรณ์ ผลิตภัณฑ์เป็นอย่างดีผลิตภัณฑ์ การติดตามพวกเขากำลังถามถึงปัญหา - ตัวอย่างเช่นถ้าคุณเปลี่ยนรหัส แต่ลืมที่จะสร้างและเช็คอินผลิตภัณฑ์ใหม่
Cascabel

ฉันมีปัญหาในการยกเว้นโฟลเดอร์ย่อย พยายามทุกอย่างรวมถึงตัวอย่างที่ถูกเขียนที่นี่ แต่ไม่ประสบความสำเร็จ ในที่สุดฉันก็เพิ่มบรรทัดว่างเพิ่มเติมระหว่างรูปแบบโฟลเดอร์และมันใช้งานได้ อาจเป็นปัญหาการเข้ารหัส ฉันมี windows และเข้ารหัสสิ่งนี้ใน UTF8
RoadBump

คำตอบ:


552

คุณลองใช้ wildcard หรือไม่

Solution/*/bin/Debug
Solution/*/bin/Release

ด้วยรุ่น 1.8.2 ของ git คุณสามารถใช้**wildcard เพื่อจับคู่ไดเรกทอรีย่อยในระดับใดก็ได้:

**/bin/Debug/
**/bin/Release/

8
มันทำงานได้ยกเว้นว่ามีโฟลเดอร์ย่อยที่มีโครงการอื่นใน Solution / Module / Project ดังนั้นตอนนี้ฉันได้เพิ่ม / * / * / bin / Debug และ / * / * / * / bin / Debug (สำหรับย่อย โฟลเดอร์) ดูเหมือนว่าคุณจะต้องเพิ่มโฟลเดอร์ย่อยสำหรับแต่ละระดับในโครงสร้างไดเรกทอรีของคุณ
Marcel

1
@Marcel: git แน่นอนจะไม่ละเลยไฟล์ใด ๆ ที่คุณไม่ได้บอก - มันไม่สนใจสิ่งที่ตรงกับสัญลักษณ์แทนไม่มากไม่น้อย
Cascabel

ฉันคิดว่าดาวคู่จะข้ามขอบเขตไดเรกทอรีเช่น: / ** / bin / Debug
Trent

11
@ Taras: แต่น่าเสียดายที่มันไม่ได้
Tuukka Mustonen

2
มีข้อผิดพลาดใน Visual Studio **ที่เกี่ยวข้องกับการเป็น ควรแก้ไขโดยตอนนี้ ลิงก์
Bogac

106

คุณสามารถใช้. gignignore ในระดับบนสุดเพื่อละเว้นไดเรกทอรีทั้งหมดในโครงการที่มีชื่อเดียวกัน ตัวอย่างเช่น:

Debug/
Release/

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


สิ่งเดียวกันสามารถทำได้โดยการเพิ่มรูปแบบลงใน$GIT_DIR/.git/info/excludeไฟล์OPs
Tim Henigan

1
ข้อแตกต่างคือไฟล์. gitignore จะเป็นไปตามรหัสดังนั้นจึงมีผลกับทุกที่ ในขณะที่ไฟล์ที่แยกนั้นเป็นโลคัลสำหรับที่เก็บของคุณเท่านั้นซึ่งหมายความว่าจะใช้กับที่เก็บเฉพาะนั้นเท่านั้น เว้นแต่ผู้กระทำอื่น ๆ มีเหตุผลที่จะต้องการกระทำไดเรกทอรีเหล่านี้ฉันจะแนะนำให้ใช้. gitignore
Andreas

1
ปัญหาอีกประการหนึ่งคือถ้าคุณมีโครงการในโซลูชันที่เรียกว่า Debug ซึ่งจะถูกละเว้นเช่นกัน ฉันคิดว่าทางออกคือการรวมกันของคำตอบและความคิดเห็นทั้งหมด - ปรับโครงสร้างโซลูชันเพื่อเก็บ dll ทั่วไปหรือที่อ้างอิงในโฟลเดอร์อื่นจากนั้นให้ละเว้น "bin /" และ / หรือใช้สัญลักษณ์แทน
Marcel

16
+1 สำหรับความคิดเห็นเกี่ยวกับการรับรองไดเรกทอรีที่ยังไม่ได้เพิ่มในคอมไพล์ หากเพิ่มไปยัง git แล้วให้ทำ:git rm -rf DirectoryName/
levibostian

57

คำถามไม่ได้ถามเกี่ยวกับการละเว้นไดเรกทอรีย่อยทั้งหมด */*แต่ฉันไม่สามารถหาคำตอบได้ทุกที่ดังนั้นฉันจะโพสต์:


1
โอกาสใดที่คุณสามารถชี้แจงได้? ฉันได้ลองใช้ชุดรูปแบบทั้งหมดนี้แล้วและไม่สามารถข้ามgit addไดเรกทอรีและไฟล์ทั้งหมดในไดเรกทอรีย่อยทั้งหมดของไดเรกทอรีนั้น ฉันได้พยายามdirname/, dirname/*, dirname/**, dirname/*/*แม้จะอยู่ในความสิ้นหวังdirname/*/*/*, ,dirname/*/*/*/* dirname/*/*/*/*/*
คริส

3
*/*ไม่สนใจไดเรกทอรีย่อยทั้งหมด แต่ไม่ใช่ไฟล์ในไดเรกทอรีปัจจุบัน ในการเพิกเฉยไดเรกทอรีย่อยที่ระบุเป็นการใช้งานปกติของ gitignore dirname, dirname/และdirname/*ทั้งหมดทำงานให้ฉัน มีสิ่งใดในสารบบที่ได้รับมอบหมายแล้ว?
mgold

มันเป็น repo ใหม่ล่าสุด - ฉันลบ.gitไดเรกทอรีทั้งหมดระหว่างความพยายามจากgit initนั้นgit add --all .(ได้ลองโดยไม่ใช้--all) โดยใช้ 1.9.4.msysgit.1 ทุกไดเรกทอรีย่อยที่ไม่ว่างเปล่าภายใต้ไดเรกทอรีที่มีชื่อของฉันจะถูกเพิ่มเข้าไปในดัชนี (ทำเครื่องหมายใน TortoiseGit และgit status) ไม่มีบรรทัดที่เกี่ยวข้องในการ.gitignoreเริ่มต้น!แต่ต้องมีข้อขัดแย้ง addสำหรับตอนนี้แก้ไขโดยการลบโฟลเดอร์ในช่วง เดาว่านี่เป็นสิ่งที่ต้องมีการขุดอีกเล็กน้อยเพื่อให้ข้อมูลที่จำเป็นในการวินิจฉัย ขอบคุณที่ให้ความมั่นใจกับฉันว่าฉันไม่ได้เข้าใจผิดกับไวยากรณ์
คริส

ถ้าฉันต้องการละเว้นโฟลเดอร์ภายในโฟลเดอร์ แต่ไม่ใช่โฟลเดอร์แรกล่ะ ในขณะที่ในฟอรั่ม / ignorethisfolder / ... แต่เขาจะไม่ละเลยโฟลเดอร์ที่เรียกว่าฟอรั่ม
Jean Carlos Racoski

สิ่งนี้ใช้ไม่ได้สำหรับฉันในการข้ามไดเรกทอรีที่ชื่อขึ้นต้นด้วยจุด " /. " และ ". * / *" ไม่ทำงานเช่นกัน
โทนี่

44

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

เพื่อเพิกเฉยไฟล์ที่เพิ่มเข้ามาแล้วเรียกใช้

$ git rm --cached

มิฉะนั้นคุณจะต้องลบไฟล์ทั้งหมดออกจากไดเรกทอรีเป้าหมายของ repo ก่อน - จากนั้นคุณสามารถข้ามโฟลเดอร์นั้นได้


12
git rm - เก็บไว้หากคุณต้องการไม่ได้ติดตาม / ไม่เกี่ยวข้องกับประวัติ แต่ต้องการเก็บไฟล์ไว้ในเครื่อง
Erik Reppen

29

นอกเหนือจากการใส่รายการที่ถูกต้องในไฟล์. gitignore ของคุณหากคุณพยายามที่จะเพิกเฉยบางสิ่งที่เพิ่มไปยัง repo แล้วคุณต้องทำgit rm -r /path/to/dirและยอมรับก่อนที่คุณจะเพิ่ม dir ในไฟล์. gitignore ของคุณ มิฉะนั้นสิ่งเดียวที่คอมไพล์จะเพิกเฉยก็คือคุณไม่สนใจคำสั่ง


19

วิธีเดียวที่ฉันได้รับสิ่งนี้เพื่อใช้กับเครื่องของฉันคือทำอย่างนี้:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

สังเกตว่าคุณต้องอนุญาตเนื้อหาในแต่ละระดับที่คุณต้องการอย่างชัดเจนอย่างไร ดังนั้นถ้าฉันมีไดเรกทอรีย่อย 5 ลึกภายใต้ชุดรูปแบบฉันยังต้องสะกดออก

นี่คือจากความคิดเห็นของ @ Yarin ที่นี่: https://stackoverflow.com/a/5250314/1696153

หัวข้อเหล่านี้มีประโยชน์:

ฉันก็ลอง

*
*/*
**/**

และ **/wp-content/themes/**

หรือ /wp-content/themes/**/*

ไม่มีสิ่งใดที่เหมาะกับฉันเช่นกัน เส้นทางและข้อผิดพลาดมากมาย!


13

หากต้องการยกเว้นเนื้อหาและไดเรกทอรีย่อย:

**/bin/*

หากต้องการยกเว้นไดเรกทอรีย่อยทั้งหมด แต่รับเนื้อหาให้เพิ่ม "/":

**/bin/*/

9

ในการเพิกเฉยไดเรกทอรีย่อยทั้งหมดคุณสามารถใช้:

**/

ใช้งานได้กับ git รุ่น 1.8.2


8

วิธีทั่วไปในการข้ามโฟลเดอร์ย่อยทั้งหมดในขณะที่ติดตามไฟล์ที่อยู่ใน/binไดเรกทอรีต่อไปคือการเพิ่มบรรทัดต่อไปนี้ในไฟล์. gitignore ของโครงการ:

bin/*/*

หากคุณต้องการละเว้นเฉพาะโฟลเดอร์ย่อยที่มีชื่อคุณสามารถทำได้:

bin/Debug/*
bin/Release/*

nb หากbinไดเรกทอรีไม่ได้อยู่ในรากของโครงการของคุณ (ข้างไฟล์. gitignore) แทนที่จะเป็นเช่น bin/*/*คุณอาจต้องการpath/to/bin/*/*

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