ฝากไว้ในโฟลเดอร์ที่ไม่มีไฟล์. git หรือไม่


16

หากฉัน tar โฟลเดอร์ที่เป็นที่เก็บ git ฉันสามารถทำได้โดยไม่รวม.gitไฟล์ที่เกี่ยวข้องหรือไม่ ถ้าไม่ฉันจะดำเนินการผ่านคำสั่งได้อย่างไร

คำตอบ:


23

git help archiveมีลักษณะเป็นครั้งแรกที่ archiveเป็นคำสั่ง git ที่อนุญาตให้สร้างไฟล์เก็บถาวรที่มีไฟล์ที่ติดตามได้เท่านั้น อาจเป็นสิ่งที่คุณกำลังมองหา ตัวอย่างหนึ่งที่ระบุไว้ในตอนท้ายของหน้าคน:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

6
นี่เป็นเพียงคลังเก็บรากคอมไพล์ repo หากมีการใช้งาน submodules - ไดเรกทอรีจะว่างเปล่า
Stann

@ Stann: ขอบคุณจากผู้ใช้ submodule อีกคน
Mark K Cowan

22

คำตอบที่ง่ายที่สุด: --exclude-vcsเพิ่ม สิ่งนี้แยกไดเรกทอรีระบบควบคุมเวอร์ชันทั้งหมด

ส่วนตัวผมใช้

tar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME

ดังนั้นสิ่งที่คุณต้องทำคือเพิ่ม--exclude-vcsตอนท้ายของคำสั่ง


1
ทุกคนที่รู้จักกันฉันคิดว่า? ;)
phk

3
ตัวเลือกทั้งหมดจะต้องอยู่ด้วยกันก่อนอาร์กิวเมนต์บน GNU / Linux
Josh Habdas

2
ตามที่ระบุไว้สำหรับ GNU / Linuxtar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Michael Irey

1
ดูเหมือนว่าน้ำมันดินของ OSX Catalina ไม่รองรับตัวเลือกนั้น ...
Fran Marzoa

20

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

หากคุณต้องการแยกเฉพาะ.gitแต่รวมทุกอย่างอื่นภายใต้ Linux หรือ FreeBSD หรือ OSX หรือ Cygwin tar มีตัวเลือกง่าย ๆ ในการแยกไดเรกทอรี:

tar -c --exclude .git -f - foo | gzip >foo.tgz

ด้วย GNU tar (เช่นภายใต้ Linux หรือ Cygwin) คุณสามารถย่อให้สั้นลงtar czf foo.tgz --exclude .git fooได้

วิธี POSIX paxของการสร้างคลังข้อมูลคือ

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz

ไม่gitcompiles ในระบบใด ๆ ที่tarไม่สามารถใช้งาน? :-)
Stéphane Gimenez

2
@ StéphaneGimenezอาจจะไม่ แต่มันจะรวบรวมในระบบที่tarไม่มี--excludeตัวเลือกเช่น OpenBSD (ซึ่งยอมรับsตัวเลือกของ pax ซ้ำกันแต่นั่นไม่ใช่ส่วนขยายไวยากรณ์คำสั่ง tar ทั่วไป)
Gilles 'หยุดความชั่วร้าย'

0

ขอบคุณคำตอบที่ฉันได้จากหนึ่งในคำถามของฉันฉันหาวิธีแก้ไขปัญหาอื่น ดังนั้นเพื่อความสมบูรณ์นี่คือทางออกสำหรับการใช้งานfind:

find . -path './.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

และหากคุณต้องการแยก.gitโฟลเดอร์ที่เป็นไปได้ภายใน (ย่อย) + โฟลเดอร์:

find . -path '*/.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

ยุคสุดท้ายสามารถทำได้ผ่าน:

find . -type d -name '.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

ค่อนข้างมีประโยชน์ถ้าคุณสามารถใช้เทคนิคการกรองอื่น ๆfindเช่นวันที่แก้ไขการอนุญาต ...

(ตามชื่อไฟล์จึงมักจะดีขึ้นจะถือว่ามิฉะนั้นคุณจะต้องใช้ null ไบต์เป็นตัวคั่นซึ่งอาจหมายถึง-print0สำหรับfindและ--nullสำหรับtarถ้าได้รับการสนับสนุน.)

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