ชำระเงินไฟล์ Git ไปยังตำแหน่งนอกพื้นที่เก็บข้อมูล


21

เป็นไปได้หรือไม่ที่จะ "ชำระเงิน" ไปยังสถานที่ตั้งนอกพื้นที่เก็บข้อมูล? สิ่งที่ฉันหมายถึงคือการโคลนสาขาโดยไม่มีไดเรกทอรี“ .git”

ตัวอย่างเช่นใช้ git เพื่อจัดการเว็บไซต์ คุณแก้ไขไฟล์บางไฟล์ส่งและคัดลอกไฟล์ไปยังเว็บเซิร์ฟเวอร์ผ่าน WebDAV WebDAV-path จะเป็นตำแหน่งนอกที่เก็บซึ่งไม่ควรมี“ .git”

นี่อาจไม่ใช่ปัญหาสำหรับการสร้างคอมไพล์ แต่เป็นไปได้หรือไม่

คำตอบ:


19

ใช่มันเป็นไปได้อย่างแน่นอน

ให้บอกว่าฉันมีที่เก็บชื่อเปลือย/srv/production.gitบนระบบปลายทาง / เซิร์ฟเวอร์

บนระบบปลายทางฉันสามารถใช้คำสั่ง cd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

หากฉันอยู่ในที่เก็บที่ไม่ได้เปิดใช้งานคำสั่งจะแตกต่างกันเล็กน้อย ช่วยบอกฉันมี respository /srv/testingไม่ใช่เปลือยที่ เพื่อเช็คเอาต์ที่ฉันจะใช้cd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

ในความเป็นจริงในระบบของฉันฉันยังทำสิ่งนี้โดยอัตโนมัติในเบ็ด post-commit ในที่production.gitเก็บของฉัน ดังนั้นเมื่อคุณผลักดันให้production.gitเป็นรุ่นล่าสุดจะตรวจสอบโดยอัตโนมัติไปยังเว็บรูท

#!/bin/sh
#
# An example hook script that is called after a successful
# commit is made.
#
# To enable this hook, rename this file to "post-commit".

GIT_WORK_TREE=/srv/production-www/ git checkout -f
# ... misc other commands to verify permissions are set correctly.

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


ค้นหาในหลายสถานที่ .. เฉพาะวิธีการทำงานยังทำความสะอาด!
karthikeayan

6

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

git archive master | tar -x -C /some/path

นี่masterเห็นได้ชัดว่าเป็นสาขาที่คุณต้องการเก็บและ/some/pathจะมีเพียงไฟล์ - ไม่หรือ.git.gitignore


หรือคุณสามารถใช้git checkout-indexซึ่งคล้ายกับ "ชำระเงิน" ของไฟล์:

git checkout-index -f -a --prefix=/some/path/

ที่นี่-aตัวเลือกบอกgitให้ตรวจสอบไฟล์ทั้งหมด คำนำหน้าจะถูกเติมไว้ในเอาต์พุต ใครบางคนยังเขียนกระดาษห่อรอบนี้git exportจะให้


2
ฉันคิดว่าคุณกำลังทำสิ่งนี้ยากกว่าที่ควรจะเป็น เพียงแค่เรียกใช้GIT_WORK_TREE=/destinationpath git checkout -fขณะที่ไดเรกทอรีปัจจุบันของคุณอยู่ด้านบนสุดของที่เก็บข้อมูลเปลือยหรือไดเรกทอรีย่อย. git คุณจะได้รับการเช็คเอาต์ไปยัง / destinationpath
Zoredache

ตกลงฉันต้องพลาดตัวเลือกนั้นอย่างน้อย +1 กับคุณ
slhck

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