จะดึงไฟล์เดียวจากที่เก็บเซิร์ฟเวอร์ใน Git ได้อย่างไร


115

ฉันกำลังทำงานบนไซต์ที่มีเซิร์ฟเวอร์ที่ใช้ Git ฉันใช้ Git สำหรับการปรับใช้ (ไม่ใช่ GitHub) สิ่งนี้ถูกตั้งค่าก่อนที่ฉันจะมีส่วนร่วมโดยใช้เมธอด hookและฉันอ้างถึงคำถามนี้และป้อนคำสั่งด้านล่าง แต่มันไม่ได้ผล

ฉันจะดึงไฟล์เดียวจากเซิร์ฟเวอร์ได้อย่างไร ตัวอย่างเช่นหากฉันต้องการอัปเดตไฟล์ในเครื่องของฉัน index.php? git pull index.phpเหรอ?



คำตอบ:


195

เป็นไปได้ที่จะทำ (ในที่เก็บที่ปรับใช้):

git fetch
// git fetch will download all the recent changes, but it will not put it in your current checked out code (working area).

ติดตามโดย:

git checkout origin/master -- path/to/file
// git checkout <local repo name (default is origin)>/<branch name> -- path/to/file will checkout the particular file from the downloaded changes (origin/master).

1
ขอบคุณ. แล้วคุณหมายถึง<revision>อะไร? ชื่อไฟล์? และถ้าไฟล์ของฉันอยู่ในไดเร็กทอรีรูทนั่นหมายความว่าฉันต้องพิมพ์: git checkout -m index.php index.php?
vsvs

ขอบคุณสำหรับคำอธิบาย
vsvs

มันเป็นไปได้*origin*/masterหรือไม่ได้จากระยะไกล? ประวัติทั้งหมดถูกดึงไปที่ repo ของฉันหรือไม่หรือดูเหมือนว่าไฟล์จะดูน่าอัศจรรย์?
Bernhard Döbler

หากคุณได้รับข้อผิดพลาดนี้ "ไม่ตรงกับไฟล์ใด ๆ ที่ทราบว่า git": "path / to / file" ไม่ควรเป็นสำเนาของเส้นทางที่คุณได้รับจากตำแหน่งไฟล์บน GitHub ซึ่งหมายถึง "repoName / fileName" คุณควรกำจัด "repoName /" แล้วจึงจะใช้งานได้
Eduard

1
@ BernhardDöblerสามารถเป็นสาขาใดก็ได้จากระยะไกล :)
chrismillah

27
git fetch --all
git checkout origin/master -- <your_file_path>
git add <your_file_path>
git commit -m "<your_file_name> updated"

นี่คือสมมติว่าคุณกำลังดึงไฟล์จากต้นทาง / ต้นแบบ



5

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

git pullการไม่กู้คืนไฟล์ที่หายไปในเครื่องทำให้ฉันผิดหวังเสมอเกี่ยวกับ git บางทีอาจเป็นเพราะฉันได้รับอิทธิพลจากระบบควบคุมเวอร์ชันอื่น ๆ (เช่นการอัปเดต svnซึ่งฉันเชื่อว่าจะกู้คืนไฟล์ที่ถูกซ่อนไว้ในเครื่อง)

git reset --hard HEADเป็นอีกทางเลือกหนึ่งในการกู้คืนไฟล์ที่น่าสนใจเนื่องจากไฟล์ดังกล่าวจะทิ้งการเปลี่ยนแปลงที่ไม่ได้ผูกมัดที่คุณมี อย่างไรก็ตามตามที่ระบุไว้ที่นี่การรีเซ็ตคอมไพล์เป็นคำสั่งที่อาจเป็นอันตรายหากคุณมีการเปลี่ยนแปลงอื่น ๆ ที่ไม่ได้ผูกมัดซึ่งคุณสนใจ

git fetch ... git checkoutกลยุทธ์ที่ระบุไว้ข้างต้นโดย @chrismillah เป็นวิธีการผ่าตัดที่ดีที่จะเรียกคืนไฟล์ในคำถาม


1
ซับซ้อนกว่าความคิดเห็นอื่น ๆ ขอบคุณ
Thecave3

3

ฉันกำลังมองหางานที่แตกต่างกันเล็กน้อย แต่ดูเหมือนสิ่งที่คุณต้องการ:

git archive --remote=$REPO_URL HEAD:$DIR_NAME -- $FILE_NAME |
tar xO > /where/you/want/to/have.it

ฉันหมายความว่าถ้าคุณต้องการจะดึงpath/to/file.xzคุณจะตั้งค่าDIR_NAMEการpath/toและการFILE_NAME file.xzดังนั้นคุณจะจบลงด้วยสิ่งที่ชอบ

git archive --remote=$REPO_URL HEAD:path/to -- file.xz |
tar xO > /where/you/want/to/have.it

และไม่มีใครช่วยคุณจากการแกะกล่องในรูปแบบอื่น ๆ แทนtar xOแน่นอน (ฉันเองที่ต้องการท่อที่นี่ใช่)


1

ลองใช้:

git checkout branchName -- fileName

เช่น:

git checkout master -- index.php

2
ข้อควรสนใจ: "git checkout master - index.php" สิ่งนี้ไม่ได้ทำการชำระเงินจากเซิร์ฟเวอร์ แต่มาจากฐานข้อมูล git ภายในจากการดึงครั้งสุดท้าย
Roberto Novakosky

0
https://raw.githubusercontent.com/[USER-NAME]/[REPOSITORY-NAME]/[BRANCH-NAME]/[FILE-PATH]

เช่น https://raw.githubusercontent.com/vipinbihari/apana-result/master/index.php

ด้วยวิธีนี้คุณจะได้รับเนื้อหาของแต่ละไฟล์เป็นข้อความแถว คุณสามารถดาวน์โหลดข้อความนั้นด้วย wget

เช่น https://raw.githubusercontent.com/vipinbihari/apana-result/master/index.php


1
OP ระบุโดยเฉพาะในคำถามที่ว่าเขาไม่ได้ใช้ github
Zeitounator

0

Windows batch นี้ใช้งานได้ไม่ว่าจะอยู่ใน GitHub หรือไม่ก็ตาม ฉันใช้มันเพราะมันแสดงข้อควรระวังบางอย่างคุณจะสังเกตเห็นว่าการดำเนินการช้าและมีข้อมูลหลายร้อยเมกะไบต์ดังนั้นอย่าใช้วิธีนี้หากความต้องการของคุณขึ้นอยู่กับแบนด์วิดท์ / หน่วยความจำ RW ที่มีอยู่

sparse_checkout.bat

pushd "%~dp0"
if not exist .\ms-server-essentials-docs mkdir .\ms-server-essentials-docs
pushd .\ms-server-essentials-docs
git init
git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git
git config core.sparseCheckout true
(echo EssentialsDocs)>>.git\info\sparse-checkout
git pull origin master

=>

C: \ Users \ ชื่อผู้ใช้ \ Desktop> sparse_checkout.bat

C: \ Users \ ชื่อผู้ใช้ \ Desktop> pushd "C: \ Users \ user name \ Desktop \"

C: \ Users \ ชื่อผู้ใช้ \ Desktop> ถ้าไม่มีอยู่ \ ms-server-essentials-docs mkdir. \ ms-server-essentials-docs

C: \ Users \ ชื่อผู้ใช้ \ Desktop> pushd. \ ms-server-essentials-docs

C: \ Users \ ชื่อผู้ใช้ \ Desktop \ ms-server-essentials-docs> git init เริ่มต้นที่เก็บ Git ว่างใน C: / Users / ชื่อผู้ใช้ / เดสก์ท็อป / ms-server-essentials-docs / .git /

C: \ Users \ ชื่อผู้ใช้ \ Desktop \ ms-server-essentials-docs> git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git การ อัปเดตต้นทางระยะไกล: การแจงวัตถุ: 97 เสร็จสิ้น ระยะไกล: การนับวัตถุ: 100% (97/97) เสร็จสิ้น ระยะไกล: การบีบอัดวัตถุ: 100% (44/44) เสร็จสิ้น ระยะไกล: รวม 145517 (เดลต้า 63), ใช้ซ้ำ 76 (เดลต้า 53), นำกลับมาใช้ใหม่ 145420 วัตถุที่รับ: 100% (145517/145517), 751.33 MiB | 32.06 MiB / s เสร็จแล้ว การแก้ปัญหาเดลต้า: 100% (102110/102110) เสร็จสิ้น จาก https://github.com/MicrosoftDocs/windowsserverdocs * [สาขา
ใหม่]
1106- ความขัดแย้ง -> ที่มา / 1106- ความขัดแย้ง * [สาขาใหม่] FromPrivateRepo -> ต้นทาง / FromPrivateRepo * [สาขาใหม่]
PR183 -> ต้นทาง / PR183 * [สาขาใหม่]
ความขัดแย้ง -> ต้นกำเนิด / ความขัดแย้ง * [สาขาใหม่]
eross-msft-patch-1 -> origin / eross-msft-patch-1 * [สาขาใหม่] -> origin / patch-1 * [สาขาใหม่] repo_sync_working_branch -> ต้นกำเนิด / repo_sync_working_branch * [สาขาใหม่] shortpatti-patch-5 -> origin / shortpatti-patch-5 * [สาขาใหม่]
master -> origin / master * [สาขาใหม่] patch-1 shortpatti-patch-4 -> origin / shortpatti-patch-4 * [สาขาใหม่]

shortpatti-patch-1 -> origin / shortpatti-patch-1 * [สาขาใหม่]
shortpatti-patch-2 -> origin / shortpatti-patch-2 * [สาขาใหม่]
shortpatti-patch-3 -> origin / shortpatti-patch -3 * [สาขาใหม่] shortpatti-patch-7 -> กำเนิด / shortpatti-patch-7 * [สาขาใหม่] shortpatti-patch-8 -> กำเนิด / shortpatti-patch-8


shortpatti-patch-6 -> กำเนิด / shortpatti-patch-6 * [สาขาใหม่]

C: \ Users \ ชื่อผู้ใช้ \ Desktop \ ms-server-essentials-docs> git config core.sparseCheckout true

C: \ Users \ ชื่อผู้ใช้ \ Desktop \ ms-server-essentials-docs> (echo EssentialsDocs) 1 >>. git \ info \ sparse-checkout

C: \ Users \ ชื่อผู้ใช้ \ Desktop \ ms-server-essentials-docs> git pull origin master
จากhttps://github.com/MicrosoftDocs/windowsserverdocs
* branch master -> FETCH_HEAD

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