ฉันจะ zip โฟลเดอร์ได้อย่างไร แต่ไม่รวมโฟลเดอร์ย่อย. git


194

ฉันกำลังพยายามสร้างไฟล์ zip จากโฟลเดอร์และฉันต้องการแยก.gitโฟลเดอร์ย่อยออกจากไฟล์ zip ที่เกิดขึ้น

ฉันไปที่โฟลเดอร์พาเรนต์ของไฟล์ที่ฉันต้องการ zip ( เรียกว่า bitvolution ) แล้วและฉันกำลังทำอยู่:

zip -r bitvolution.zip bitvolution -x ".git"

แต่มันไม่ได้แยก.gitโฟลเดอร์ย่อย

-x .git*ฉันได้พยายามชุดต่างๆ, -x \.git/*, -x .git/\*, -x \.git/\*, ฉันได้ลองใช้เส้นทางแบบเต็มสำหรับอาร์กิวเมนต์ที่แยกออกไป แต่ไม่ได้ไปถึงที่นั่น

คำตอบ:


232

นิพจน์ที่ถูกต้องคือ-x *.git*ดังนั้นคำสั่งทั้งหมดควรเป็น:

zip -r bitvolution.zip bitvolution -x *.git*

คำอธิบายจากhttp://selfsolved.com/problems/zip-command-exclude-svn-director :

คาถาที่ถูกต้องคือ

zip -9 -r --exclude=*.svn*  foo.zip [directory-to-compress]

คุณยังสามารถเพิ่ม a
--exclude=*.DS_Store*เพื่อแยกไฟล์เมตาดาต้าที่แสดงไดเรกทอรี Mac OS X ที่น่ารำคาญได้

ขอให้สังเกตว่านิพจน์ที่ส่งผ่านไป--excludeนั้นกำลังใช้เส้นทางไดเรกทอรีสัมพัทธ์ดั้งเดิมทั้งหมดเป็นสตริงดั้งเดิมที่จะเปรียบเทียบ ดังนั้น.svn/*ด้วยตัวเองไม่ทำงาน อักขระไวด์การ์ดที่อยู่ด้านหน้าทำให้แน่ใจว่าตรงกับ.svnไดเร็กทอรีที่ใดก็ได้ในแผนผังไดเร็กทอรี


20
ฉันต้องห่อกลมในคำพูดหรือหนีเครื่องหมายดอกจันด้วยแบ็กสแลชเหมือนzip --exclude '*.git*' -r directory.zip directoryหรือzip --exclude \*.git\* -r directory.zip directory
Dmitry Minkovsky

6
หากคุณกังวลเกี่ยวกับการสูญเสียไฟล์อื่น ๆ ที่เรียกว่า something.gitwhatever --exclude /.git*คุณยังสามารถใช้
Erin โทร

4
ใน ZSH ผมต้องเพิ่มเครื่องหมาย:-x \*.git\*
DmitrySandalov

2
ทางเลือกที่ฉันต้องการสำหรับแบ็กสแลชและเครื่องหมายคำพูดใน zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien

จะใช้กับ tar ได้อย่างไร? มันไม่ทำงานกับคำสั่ง tar
RN Kushwaha

123

หากคุณกำลังพยายามบีบอัดโปรเจ็กต์ที่เก็บไว้ใน Git ให้ใช้git archiveคำสั่ง จากภายในไดเรกทอรีต้นทาง:

git archive -o bitvolution.zip HEAD

คุณสามารถใช้ commit หรือ tag ID แทนHEADการเก็บถาวรโครงการในบางจุด

หากคุณต้องการเพิ่มคำนำหน้า (เช่นโฟลเดอร์ระดับบนสุด) ให้กับทุกไฟล์:

git archive -o bitvolution.zip --prefix=bitvolution/ HEAD

คุณยังสามารถปรับระดับการบีบอัดระหว่าง 0 (ไม่บีบอัด) และ 9 (การบีบอัดสูงสุด) รวมตัวอย่างเช่น

git archive -o bitvolution.zip -9 HEAD

สำหรับตัวเลือกอื่น ๆ ให้ดูที่หน้าช่วยเหลือ ( git help archive)


25
ไม่เพียง แต่จะไม่รวมโฟลเดอร์ git แต่รวมถึงสิ่งที่อยู่ในไฟล์ gitignore ด้วยเช่นกัน คุณได้รับการโหวต
JoeMoe1984

1
สิ่งที่ฉันต้องการทำ!
Bjarte

ฉันไปงานปาร์ตี้สาย แต่สิ่งนี้ทำให้ฉันหายไปอย่างแน่นอน คำตอบที่ดี!
Tom

ฉันสงสัยว่าทำไมนี่ไม่ใช่คำตอบที่ดีที่สุด
nabtron

สำหรับผมนี่เป็นที่ยิ่งใหญ่ที่สุด TIL วันนี้ ...
Shawn CICORIA

27

ฉันเพิ่มแบ็กสแลช:

zip -r bitvolution.zip bitvolution -x \*.git\*

หน้าคนเกี่ยวกับแบ็กสแลช:

แบ็กสแลชหลีกเลี่ยงการทดแทนชื่อไฟล์ของเชลล์เพื่อให้การจับคู่ชื่อดำเนินการโดย zip ในทุกระดับไดเรกทอรี


การเตรียมเครื่องหมายดอกจันที่มีเครื่องหมายสแลชสำหรับฉันบน Ubuntu 14.04 เพื่อแยกไดเรกทอรี
Dimitry K

6

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

git archive --format=zip HEAD -o bitvolution.zip

2

หากคุณใช้ zsh คำสั่งควรมีลักษณะดังนี้:

zip -r target_name.zip source_dir -x '/*.git/*'

ถ้าคุณใช้: zip -r target_name.zip source_dir -x /*.git/*. โดยไม่มี 'regex', zsh จะประมวลผลก่อนที่จะเรียกใช้ zip คุณจะได้รับข้อความแสดงข้อผิดพลาด:

zsh: no matches found: /*.git/*

ขอบคุณ! นั่นคือสิ่งที่ใช้ได้กับฉันโดยใช้ Bash บน Ubuntu บน Windows
Adriano Monecchi

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