วิธีเช็คเอาต์ไฟล์เดียวอย่างกระจัดกระจายเพียงไฟล์เดียวจากที่เก็บ git?


445

ฉันจะเช็คเอาท์ไฟล์เดียวจาก repo git ได้อย่างไร


8
คุณหมายถึงอะไรโดยเช็คเอาท์? รับสำเนาของไฟล์เดียวจากที่เก็บระยะไกลหรือไม่
Cascabel

2
หาก repo ที่เป็นปัญหากำลังใช้ gitweb คุณสามารถดาวน์โหลดไฟล์ได้จากตรงนั้น ในขณะที่ฉันกำลังพยายามอธิบายด้านล่างสิ่งที่คุณถามไม่ใช่การดำเนินการคอมไพล์มาตรฐาน
Cascabel


คุณสามารถใช้ส่วนขยาย chrome GitHub Mateช่วยให้คุณคลิกไอคอนไฟล์เพื่อดาวน์โหลด
Cam Song

การทำซ้ำที่เป็นไปได้ของการดึงไฟล์เดียวจากที่เก็บ
rishta

คำตอบ:


251

เดิมผมกล่าวถึงในปี 2012 git archive(ดูจาเร็ดฟอร์ซิ 's คำตอบและโรเบิร์ตอัศวิน ' s คำตอบ ) ตั้งแต่git1.7.9.5 (มีนาคม 2012) , พอล Brannan 's คำตอบ :

git archive --format=tar --remote=origin HEAD:path/to/directory -- filename | tar -O -xf -

แต่ในปี 2013 นั่นก็คือไม่มีความเป็นไปได้อีกต่อไปสำหรับระยะไกล https://github.com URL ที่
ดูหน้าเก่า " ฉันจะเก็บที่เก็บถาวรได้หรือไม่ "

ปัจจุบัน (2018) หน้า " เกี่ยวกับการจัดเก็บเนื้อหาและข้อมูลบน GitHub " แนะนำให้ใช้บริการของบุคคลที่สามเช่นGHTorrentหรือGH เอกสารเก่า


ดังนั้นคุณสามารถจัดการกับสำเนา / สำเนาโคลน:

หรือคุณสามารถทำต่อไปนี้ถ้าคุณมีสำเนาของพื้นที่เก็บข้อมูลเปลือยตามที่กล่าวไว้ในคำตอบนี้ ,

git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file

หรือคุณต้องลอกแบบ repo ก่อนซึ่งหมายความว่าคุณได้รับประวัติเต็ม: - ใน. git repo - ในแผนผังการทำงาน

  • แต่คุณสามารถชำระเงินแบบเบาบาง (ถ้าคุณใช้ Git1.7 +),:
    • เปิดใช้งานตัวเลือกการชำระเงินแบบเบาบาง ( git config core.sparsecheckout true)
    • เพิ่มสิ่งที่คุณต้องการดูใน.git/info/sparse-checkoutไฟล์
    • อ่านแผนผังการทำงานใหม่เพื่อแสดงเฉพาะสิ่งที่คุณต้องการ

หากต้องการอ่านแผนผังการทำงานอีกครั้ง:

$ git read-tree -m -u HEAD

ด้วยวิธีนี้คุณจะได้ต้นไม้ทำงานรวมถึงสิ่งที่คุณต้องการอย่างแม่นยำ (แม้ว่าจะเป็นไฟล์เดียวเท่านั้น)


คะแนนRichard Gomes ( ในความคิดเห็น ) ถึง " ฉันจะโคลนดึงหรือชำระเงินเบาบางไดเรกทอรีเดียวหรือรายการไดเรกทอรีจากพื้นที่เก็บข้อมูล git ได้อย่างไร "

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


คุณสามารถส่งการเปลี่ยนแปลงในการชำระเงินเบาบางได้หรือไม่
Tilo

2
@Tilo: ไม่แน่ใจ แต่ควรจะเป็นไปได้เพราะการโคลนนิ่งเป็นแบบเต็ม
VonC

3
วิธีนี้ดีกว่า "การชำระเงิน Git HASH path-to-file" ตามที่ระบุไว้ในคำตอบอื่น ๆ เป็นเพียงที่ไม่สามารถใช้ได้ในเวลา?
0x6A75616E

2
@ ความคิดที่จะไม่ต้องโหลดต้นไม้ทำงานทั้งหมดก่อนที่จะทำการชำระเงินคอมไพล์
VonC

2
btw เราสามารถใช้git archiveตอนนี้
Jared Forsyth

197

ก่อนอื่นคัดลอก repo ด้วยตัวเลือก -n ซึ่งจะระงับการเช็คเอาต์เริ่มต้นของไฟล์ทั้งหมดและตัวเลือก - ความลึก 1 ซึ่งหมายความว่าจะได้รับการแก้ไขล่าสุดของแต่ละไฟล์เท่านั้น

git clone -n git://path/to/the_repo.git --depth 1

จากนั้นลองดูเฉพาะไฟล์ที่คุณต้องการ:

cd the_repo
git checkout HEAD name_of_file

7
ในขณะที่ตัวอักษรนี้จะตรวจสอบไฟล์เดียวมันแทบจะไม่แน่นอนว่า OP ต้องการทำอะไรเนื่องจากพวกเขาจะมีไฟล์ทั้งหมด (และการเช็คเอาต์เป็นแบบไม่มี op)
Cascabel

5
ฉันไม่คิดว่าสิ่งนี้จะใช้งานได้ - -nเนื่องจากแผนผังการทำงานและดัชนีจะซิงค์กัน นั่นคือเนื้อหาทั้งหมดแสดงว่าถูกลบ คุณมีอย่างใดอย่างหนึ่งหรือgit reset HEAD git checkout HEAD fileนอกจากนี้ยังเป็นเรื่องยากที่จะทำงานกับที่เก็บข้อมูล ณ จุดนี้ถ้าคุณไม่เข้าใจวิธีการใช้งานคอมไพล์
Cascabel

2
และถ้า OP และ OOP อย่าง DanielElliott ต้องการเพียงแค่ไฟล์ (ไม่ใช่ repo) ที่เพิ่มrm -rf .gitเข้าไปในสคริปต์ของ NickMoore จะช่วยทำความสะอาดร่องรอยทั้งหมดของ repo ที่ถูกโคลนและอาจทำให้ Jefromi กังวลเกี่ยวกับการใช้ repo ที่ยากต่อการใช้งาน ทำให้มีประโยชน์มากสำหรับฉันสำหรับแอปพลิเคชั่นหลายตัวเช่นความท้าทายของฉันในวันนี้เพื่อสร้าง hook การโพสต์เพื่ออัปเดตเวอร์ชันของ hook การโพสต์รับอื่นโดยอัตโนมัติ
เตาอบ

6
นี่เป็นคำตอบที่ดีกว่าคำตอบที่ได้รับ ดีใจที่ฉันอ่านต่อไป
Eric Uldall

6
คำตอบนี้ดีที่สุด (แต่gitไม่ดีที่สุดสำหรับงานประเภทนี้) คำตอบนี้ยังเป็นที่ถูกต้องสำหรับคำถามนี้หรือนี้เป็นที่นิยมอีกคนหนึ่งและคนอื่น ๆ อีกมากมาย: การเปลี่ยนแปลงไปname_of_file name_of_folderGit ในปัจจุบัน (2014s) เสนอsubmodulesให้กับเจ้าของ repo ข้อเสนอที่เป็นมิตรสำหรับผู้ใช้ repo
Peter Krauss

108

หากคุณมีสำเนาของ git repo อยู่แล้วคุณสามารถเช็คเอาท์รุ่นของไฟล์โดยใช้ a git logเพื่อค้นหา hash-id (เช่น 3cdc61015724f9965575ba954c8cd4232c8b42e4) และพิมพ์เพียงแค่:

git checkout hash-id path-to-file

นี่คือตัวอย่างจริง:

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /var/www/css/page.css

12
คุณสามารถใช้แท็กหรือชื่อสาขาได้เช่นกันไม่ใช่แค่แฮช สิ่งเหล่านี้มักจะง่ายกว่า
Rob Kennedy

4
ทางออกที่ดี แต่ถ้าpath-to-fileเป็นไดเรกทอรีและปัจจุบันHEADมีไฟล์บางไฟล์ในขณะที่targetไม่มี (หรือกลับกัน) ไฟล์นี้จะอัปเดตไฟล์ไม่ถูกต้อง มีวิธีจัดการไหม?
MasterMind

2
เรียบง่ายและดีกว่า ขอบคุณ!
Kerem atam

ข้อผิดพลาด: pathspec เส้นทางเป็นเส้นทางบนพีซีในระบบหรือเส้นทางบนพีซีระยะไกลหรือไม่
Paul McCarthy

1
@PaulMcCarthy - ท้องถิ่น
techexpert

60

โดยทั่วไปแล้วจะไม่สามารถดาวน์โหลดได้เพียงไฟล์เดียวgitโดยไม่ต้องดาวน์โหลดที่เก็บทั้งหมดตามคำแนะนำในคำตอบแรก เป็นเพราะ Git ไม่ได้จัดเก็บไฟล์อย่างที่คุณคิด (ตามที่ CVS / SVN ทำ) แต่มันจะสร้างไฟล์ตามประวัติทั้งหมดของโครงการ

แต่มีวิธีแก้ไขปัญหาเฉพาะบางกรณี ตัวอย่างด้านล่างด้วยตัวยึดสำหรับuser, project, ,branchfilename

GitHub

wget https://raw.githubusercontent.com/user/project/branch/filename

GitLab

wget https://gitlab.com/user/project/raw/branch/filename

GitWeb

หากคุณใช้Git บนเซิร์ฟเวอร์ - GitWebคุณอาจลองใช้ตัวอย่าง (เปลี่ยนเป็นเส้นทางที่ถูกต้อง):

wget "http://example.com/gitweb/?p=example;a=blob_plain;f=README.txt;hb=HEAD"

GitWeb ที่ drupalcode.org

ตัวอย่าง:

wget "http://drupalcode.org/project/ads.git/blob_plain/refs/heads/master:/README.md"

googlesource.com

มีคุณสมบัติที่ไม่มีเอกสารซึ่งอนุญาตให้คุณดาวน์โหลดไฟล์ raw แบบเข้ารหัส 64 ฐาน:

curl "https://chromium.googlesource.com/chromium/src/net/+/master/http/transport_security_state_static.json?format=TEXT" | base64 --decode

ในกรณีอื่นให้ตรวจสอบว่าที่เก็บข้อมูล Git ของคุณใช้เว็บอินเตอร์เฟสอยู่หรือไม่

หากยังไม่ได้ใช้อินเตอร์เฟซเว็บใด ๆ คุณอาจพิจารณาที่จะผลักดันรหัสของคุณไปยังบริการภายนอกเช่นGitHub , Bitbucket , ฯลฯ และใช้เป็นกระจก

หากคุณไม่ได้wgetติดตั้งลองcurl -O (url)อีกทางหนึ่ง


2
และถ้าฉันไม่ใช้ GitHub?
ซูลู

60
จากนั้นอย่าใช้วิธีนี้
Alan

4
ฉันจะโต้แย้งกับคำสั่งที่คอมไพล์ "สร้าง [ไฟล์] ขึ้นอยู่กับประวัติทั้งหมดของโครงการ" มันถูกต้องมากขึ้นที่จะบอกว่าคอมไพล์เก็บสแน็ปช็อตของสถานะของไฟล์ในรูปแบบของต้นไม้แฮช แน่นอนว่าไม่มีการสร้างเกิดขึ้น
Jay Sullivan

3
คำตอบนี้มีประโยชน์มากที่สุดสำหรับฉันเนื่องจากฉันพยายามกู้คืนไฟล์ที่ฉันตั้งใจลบในเครื่องพร้อมกับคนอื่น ๆ (โดยไม่ต้องลบ) แต่ภายหลังตัดสินใจว่ามันจำเป็นในขณะที่คนอื่น ๆ ยังไม่ได้
rshdev

8
คุณรู้ว่ารู้สึกจมเมื่อคุณต้องการทำอะไรง่ายๆกับ Git มาเพื่อดูว่ามันทำอย่างไรและผ่านครึ่งคำตอบที่สมองของคุณหยุดและทุกอย่างจะเลือนและเศร้า จากนั้นคุณเลื่อนลงและค้นหาwgetคำตอบที่ยอดเยี่ยมและความเรียบง่ายกลับมาพร้อมกับความสุข ขอบคุณชาย
pgr


40

สำหรับคำอธิบายเพิ่มเติม broc.seibคำตอบ 's git-checkoutอธิบายสิ่งที่เป็นส่วนที่เกี่ยวข้องของหน้าคนสำหรับ
Shihe Zhang

29

ตอนนี้เราทำได้แล้ว! เนื่องจากนี่เป็นผลลัพธ์แรกบน google ฉันคิดว่าฉันจะอัปเดตเป็นสถานะล่าสุด ด้วยการถือกำเนิดของ git 1.7.9.5 เรามีgit archiveคำสั่งที่จะช่วยให้คุณสามารถดึงไฟล์เดียวจากโฮสต์ระยะไกล

git archive --remote=git://git.foo.com/project.git HEAD:path/in/repo filename | tar -x

ดูคำตอบแบบเต็มได้ที่นี่https://stackoverflow.com/a/5324532/290784


@Benubird เป็นชื่อโฮสต์ของ repo ของคุณ สำหรับ github (ถ้า github สนับสนุนคำสั่งเก็บถาวรซึ่งล่าสุดฉันตรวจสอบมันไม่ได้) มันจะเป็นgithub.com
Jared Forsyth

นี้ทำงานให้ฉัน แต่ถ้าฉันระบุสาขา (หรือ refname) เพียงอย่างเดียวเช่นเพียงHEADหรือไม่master HEAD:directory
stormbeta

3
สิ่งนี้ได้ผลกับฉันใน bitbucket:git archive --remote=git@bitbucket.org:user/repo branch:path/to file | tar -x
Dave

24

ทำงานใน GIT 1.7.2.2

ตัวอย่างเช่นคุณมีระยะไกลsome_remoteมีสาขาbranch1 , branch32

ดังนั้นการเช็คเอาต์ไฟล์เฉพาะที่คุณเรียกคำสั่งนี้:

git checkout remote/branch path/to/file

มันจะเป็นแบบนี้

git checkout some_remote/branch32 conf/en/myscript.conf
git checkout some_remote/branch1 conf/fr/load.wav

คำสั่งเช็คเอาท์นี้จะคัดลอกโครงสร้างไฟล์ทั้งหมด conf / en และ conf / fr ไปยังไดเรกทอรีปัจจุบันที่คุณเรียกคำสั่งเหล่านี้ (แน่นอนฉันคิดว่าคุณวิ่ง git init ในบางจุดก่อน)


5
แต่คุณต้องวิ่งgit fetch some_remoteก่อนใช่ไหม?
phihag

15

ง่ายมาก:

git checkout from-branch-name -- path/to/the/file/you/want

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

นี่คือส่วนที่เกี่ยวข้องของ manpage สำหรับ git-checkout

git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
       When <paths> or --patch are given, git checkout does not switch
       branches. It updates the named paths in the working tree from the
       index file or from a named <tree-ish> (most often a commit). In
       this case, the -b and --track options are meaningless and giving
       either of them results in an error. The <tree-ish> argument can be
       used to specify a specific tree-ish (i.e. commit, tag or tree) to
       update the index for the given paths before updating the working
       tree.

ปลายหมวกสู่ Ariejan de Vroom ที่สอนฉันจากโพสต์บล็อกนี้


4
เยี่ยมเลยถ้าไม่ใช่ความจริงคุณต้องโคลนนิ่งก่อน
Antoniossss

9

git clone --filter จาก Git 2.19

ตัวเลือกนี้จะข้ามการดึงข้อมูลวัตถุที่ไม่ต้องการจากเซิร์ฟเวอร์:

git clone --depth 1 --no-checkout --filter=blob:none \
  "file://$(pwd)/server_repo" local_repo
cd local_repo
git checkout master -- mydir/myfile

เซิร์ฟเวอร์ควรกำหนดค่าด้วย:

git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1

ไม่มีการสนับสนุนเซิร์ฟเวอร์ตั้งแต่ v2.19.0 แต่สามารถทดสอบในเครื่องได้แล้ว

สิ่งที่ต้องทำ: --filter=blob:noneข้าม blobs ทั้งหมด แต่ยังคงดึงวัตถุต้นไม้ทั้งหมด แต่สำหรับ repo ปกติมันควรจะเล็กเมื่อเทียบกับไฟล์ของตัวเองดังนั้นมันก็ดีพออยู่แล้ว ถามได้ที่: https://www.spinics.net/lists/git/msg342006.html Devs ตอบ a --filter=tree:0อยู่ในผลงานที่ต้องทำ

จำไว้ว่า--depth 1มีนัยแล้ว--single-branchโปรดดู: ฉันจะโคลนกิ่งเดียวใน Git ได้อย่างไร

file://$(path)จำเป็นต้องเอาชนะgit cloneshenanigans ของโปรโตคอล: วิธีการโคลนที่เก็บ git ในพื้นที่ที่มีเส้นทางสัมพัทธ์อย่างไร

รูปแบบของการจัดทำเอกสารเกี่ยวกับ--filterman git-rev-list

มีการขยายส่วนขยายไปยังโปรโตคอลระยะไกล Git เพื่อสนับสนุนคุณสมบัตินี้

เอกสารบนต้นไม้ Git:

ทดสอบมันออกมา

#!/usr/bin/env bash
set -eu

list-objects() (
  git rev-list --all --objects
  echo "master commit SHA: $(git log -1 --format="%H")"
  echo "mybranch commit SHA: $(git log -1 --format="%H")"
  git ls-tree master
  git ls-tree mybranch | grep mybranch
  git ls-tree master~ | grep root
)

# Reproducibility.
export GIT_COMMITTER_NAME='a'
export GIT_COMMITTER_EMAIL='a'
export GIT_AUTHOR_NAME='a'
export GIT_AUTHOR_EMAIL='a'
export GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000'
export GIT_AUTHOR_DATE='2000-01-01T00:00:00+0000'

rm -rf server_repo local_repo
mkdir server_repo
cd server_repo

# Create repo.
git init --quiet
git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1

# First commit.
# Directories present in all branches.
mkdir d1 d2
printf 'd1/a' > ./d1/a
printf 'd1/b' > ./d1/b
printf 'd2/a' > ./d2/a
printf 'd2/b' > ./d2/b
# Present only in root.
mkdir 'root'
printf 'root' > ./root/root
git add .
git commit -m 'root' --quiet

# Second commit only on master.
git rm --quiet -r ./root
mkdir 'master'
printf 'master' > ./master/master
git add .
git commit -m 'master commit' --quiet

# Second commit only on mybranch.
git checkout -b mybranch --quiet master~
git rm --quiet -r ./root
mkdir 'mybranch'
printf 'mybranch' > ./mybranch/mybranch
git add .
git commit -m 'mybranch commit' --quiet

echo "# List and identify all objects"
list-objects
echo

# Restore master.
git checkout --quiet master
cd ..

# Clone. Don't checkout for now, only .git/ dir.
git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo
cd local_repo

# List missing objects from master.
echo "# Missing objects after --no-checkout"
git rev-list --all --quiet --objects --missing=print
echo

echo "# Git checkout fails without internet"
mv ../server_repo ../server_repo.off
! git checkout master
echo

echo "# Git checkout fetches the missing file from internet"
mv ../server_repo.off ../server_repo
git checkout master -- d1/a
echo

echo "# Missing objects after checking out d1/a"
git rev-list --all --quiet --objects --missing=print

GitHub ต้นน้ำ

ผลผลิตใน Git v2.19.0:

# List and identify all objects
c6fcdfaf2b1462f809aecdad83a186eeec00f9c1
fc5e97944480982cfc180a6d6634699921ee63ec
7251a83be9a03161acde7b71a8fda9be19f47128
62d67bce3c672fe2b9065f372726a11e57bade7e
b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1
308150e8fddde043f3dbbb8573abb6af1df96e63 d1/a
f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b
84de03c312dc741d0f2a66df7b2f168d823e122a d2
0975df9b39e23c15f63db194df7f45c76528bccb d2/a
41484c13520fcbb6e7243a26fdb1fc9405c08520 d2/b
7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master
8b25206ff90e9432f6f1a8600f87a7bd695a24af master/master
ef29f15c9a7c5417944cc09711b6a9ee51b01d89
19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch
1b671b190e293aa091239b8b5e8c149411d00523 mybranch/mybranch
c3760bb1a0ece87cdbaf9a563c77a45e30a4e30e
a0234da53ec608b54813b4271fbf00ba5318b99f root
93ca1422a8da0a9effc465eccbcb17e23015542d root/root
master commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec
mybranch commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec
040000 tree b64bf435a3e54c5208a1b70b7bcb0fc627463a75    d1
040000 tree 84de03c312dc741d0f2a66df7b2f168d823e122a    d2
040000 tree 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3    master
040000 tree 19f7a4ca4a038aff89d803f017f76d2b66063043    mybranch
040000 tree a0234da53ec608b54813b4271fbf00ba5318b99f    root

# Missing objects after --no-checkout
?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4
?8b25206ff90e9432f6f1a8600f87a7bd695a24af
?41484c13520fcbb6e7243a26fdb1fc9405c08520
?0975df9b39e23c15f63db194df7f45c76528bccb
?308150e8fddde043f3dbbb8573abb6af1df96e63

# Git checkout fails without internet
fatal: '/home/ciro/bak/git/test-git-web-interface/other-test-repos/partial-clone.tmp/server_repo' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

# Git checkout fetches the missing directory from internet
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done.

# Missing objects after checking out d1
?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4
?8b25206ff90e9432f6f1a8600f87a7bd695a24af
?41484c13520fcbb6e7243a26fdb1fc9405c08520
?0975df9b39e23c15f63db194df7f45c76528bccb

สรุป: blobs ทั้งหมดยกเว้นd1/aหายไป เช่นf70a17f51b7b30fec48a32e4f19ac15e261fd1a4ซึ่งd1/bไม่ได้อยู่ที่นั่นหลังจากเช็คเอาต์d1/ต์

โปรดทราบว่าroot/rootและmybranch/mybranchจะหายไป แต่--depth 1ซ่อนไว้จากรายการไฟล์ที่หายไป หากคุณลบไฟล์--depth 1เหล่านั้นจะปรากฏในรายการไฟล์ที่หายไป


2
ดีฉันต้องพลาดตัวเลือกนั้น +1
VonC

7

คุณสามารถทำได้โดย

git archive --format=tar --remote=origin HEAD | tar xf -
git archive --format=tar --remote=origin HEAD <file> | tar xf -

7

สมมติว่าชื่อไฟล์คือ 123.txt สิ่งนี้ใช้ได้กับฉัน:

git checkout --theirs  123.txt

หากไฟล์อยู่ในไดเรกทอรี A ตรวจสอบให้แน่ใจว่าได้ระบุอย่างถูกต้อง:

git checkout --theirs  "A/123.txt"

6

มีสองรูปแบบสำหรับสิ่งที่ได้รับ:

git archive --format=tar --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -O -xf -

และ:

git archive --format=zip --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | funzip

สิ่งเหล่านี้เขียนไฟล์ไปยังเอาต์พุตมาตรฐาน


4

ในคอมไพล์คุณไม่ได้ไฟล์ 'ชำระเงิน' ก่อนที่คุณจะอัปเดต - ดูเหมือนว่านี่คือสิ่งที่คุณเป็นหลังจาก

ระบบจำนวนมากเช่น clearcase, csv และอื่น ๆ กำหนดให้คุณต้อง 'ชำระเงิน' ไฟล์ก่อนจึงจะสามารถทำการเปลี่ยนแปลงได้ Git ไม่ต้องการสิ่งนี้ คุณโคลนที่เก็บแล้วทำการเปลี่ยนแปลงในสำเนาของที่เก็บในเครื่องของคุณ

เมื่อคุณอัปเดตไฟล์แล้วคุณสามารถทำได้:

git status

เพื่อดูว่ามีการแก้ไขไฟล์ใดบ้าง คุณเพิ่มสิ่งที่คุณต้องการกระทำindexก่อน ( indexเหมือนรายการที่จะเช็คอิน):

git add .

หรือ

git add blah.c

จากนั้นgit statusจะแสดงให้คุณเห็นว่าไฟล์ใดบ้างที่ถูกแก้ไขและไฟล์ใดindexพร้อมที่จะให้คำแนะนำหรือเช็คอิน

ในการส่งไฟล์ไปยังสำเนาที่เก็บของคุณให้ทำ:

git commit -a -m "commit message here"

ดูgitเว็บไซต์สำหรับลิงก์ไปยังคู่มือและคำแนะนำ


1
และหากเป้าหมายของคุณคือการแก้ไขไฟล์เดี่ยวนี้และส่งกลับมาคุณจะต้องกด (แต่คุณอาจไม่มีการเข้าถึงแบบพุชสำหรับโครงการนี้) หรือใช้git format-patchเพื่อสร้างโปรแกรมแก้ไขสำหรับการส่ง ( git format-patch -1จะสร้างโปรแกรมปะแก้ สำหรับการกระทำล่าสุดของคุณ)
Cascabel

ขอบคุณนั่นเป็นคำอธิบายที่ดีเกี่ยวกับ Git จาก Clearcase
Kolob Canyon

4

นี่คือโซลูชันที่สมบูรณ์แบบสำหรับการดึงและผลักดันไฟล์เฉพาะภายในที่เก็บ git:

  1. ก่อนอื่นคุณต้องทำการโคลนพื้นที่เก็บข้อมูลคอมไพล์ด้วยคำใบ้พิเศษ - ไม่ต้องเช็คเอาท์
git clone --no-checkout <git url>
  1. ขั้นตอนต่อไปคือการกำจัดไฟล์ที่ไม่มีสถานะในดัชนีด้วยคำสั่ง:
git reset
  1. ตอนนี้คุณได้รับอนุญาตให้เริ่มดึงไฟล์ที่คุณต้องการเปลี่ยนด้วยคำสั่ง:
git checkout origin/master <path to file>
  1. ตอนนี้โฟลเดอร์ที่เก็บมีไฟล์ที่คุณสามารถเริ่มแก้ไขได้ทันที หลังจากแก้ไขคุณจะต้องดำเนินการตามลำดับและคำสั่งที่คุ้นเคย
git add <path to file>
git commit -m <message text>
git push

ดูลิงก์สำหรับข้อมูลเพิ่มเติมบางส่วน


1

ดูเหมือนว่าคุณกำลังพยายามถ่ายทอดความคิดจากการควบคุมเวอร์ชันรวมศูนย์ซึ่งคอมไพล์โดยธรรมชาติไม่ได้ - มันกระจาย หากคุณต้องการทำงานกับพื้นที่เก็บข้อมูล git คุณก็จะทำการโคลน แล้วคุณมีทั้งหมดของเนื้อหาของต้นไม้การทำงานและทั้งหมดของประวัติศาสตร์ (ดีทุกอย่างที่นำไปสู่ปลายของสาขาในปัจจุบันอย่างน้อย) ไม่ได้เป็นเพียงไฟล์เดียวหรือภาพรวมจากเดียวกระทำ

 git clone /path/to/repo
 git clone git://url/of/repo
 git clone http://url/of/repo

1

หากคุณต้องการไฟล์เฉพาะจากสาขาเฉพาะจากที่เก็บ Git ระยะไกลคำสั่งคือ:

git archive --remote=git://git.example.com/project.git refs/heads/mybranch path/to/myfile |tar xf -

ส่วนที่เหลือสามารถได้มาจากคำตอบของ @ VonC:

หากคุณต้องการไฟล์เฉพาะจากสาขาหลักมันคือ:

git archive --remote=git://git.example.com/project.git HEAD path/to/myfile |tar xf -

หากคุณต้องการไฟล์เฉพาะจากแท็กมันคือ:

git archive --remote=git://git.example.com/project.git mytag path/to/myfile |tar xf -

Mother Corp. ตัดสินใจว่าการเข้าถึง HTTP / S อัตโนมัติตอนนี้เป็น verboten! เทคนิคนี้ช่วยให้ฉันสามารถรับไฟล์เดียวจากที่เก็บโดยอัตโนมัติโดยไม่ต้องเช็ค Whole Thing ขอขอบคุณและขอชื่นชม!
JS

0

ฉันไม่เห็นสิ่งที่ทำงานให้ฉันอยู่ที่นี่ดังนั้นฉันจะรวมมันควรมีใครอยู่ในสถานการณ์ของฉัน

สถานการณ์ของฉันฉันมีที่เก็บระยะไกลบางทีอาจเป็น 10,000 ไฟล์และฉันต้องการสร้างไฟล์ RPM สำหรับระบบ Linux ของฉัน การสร้าง RPM นั้นรวมถึงโคลนคอมไพล์ของทุกสิ่ง ทั้งหมดที่ฉันต้องการคือหนึ่งไฟล์เพื่อเริ่มการสร้าง RPM ฉันสามารถโคลนทรีซอร์สทั้งหมดซึ่งทำในสิ่งที่ฉันต้องการ แต่ใช้เวลาเพิ่มอีกสองนาทีในการดาวน์โหลดไฟล์ทั้งหมดเมื่อทั้งหมดที่ฉันต้องการคือหนึ่ง ฉันพยายามใช้ตัวเลือกการเก็บถาวร git ที่กล่าวถึงและฉันได้รับ "ถึงแก่ชีวิต: การดำเนินการไม่ได้รับการสนับสนุนโดยโปรโตคอล" ดูเหมือนว่าฉันจะต้องเปิดใช้งานตัวเลือกการเก็บถาวรบางอย่างบนเซิร์ฟเวอร์และเซิร์ฟเวอร์ของฉันได้รับการบำรุงรักษาโดยอันธพาลข้าราชการที่ดูเหมือนจะสนุกกับการทำให้ยากต่อการทำสิ่งต่าง ๆ

ในที่สุดสิ่งที่ฉันทำก็คือฉันเข้าสู่เว็บอินเตอร์เฟสสำหรับ bitbucket และดูไฟล์เดียวที่ฉันต้องการ ฉันคลิกขวาที่ลิงก์เพื่อดาวน์โหลดสำเนาดิบของไฟล์และเลือก "คัดลอกทางลัด" จากป๊อปอัพที่เกิดขึ้น ฉันไม่สามารถดาวน์โหลดไฟล์ raw ได้เพราะฉันต้องการทำให้เป็นอัตโนมัติและฉันไม่มีเบราว์เซอร์ส่วนต่อประสานบนเซิร์ฟเวอร์ Linux ของฉัน

เพื่อประโยชน์ในการพูดคุยที่ส่งผลให้ URL:

https://ourArchive.ourCompany.com/projects/ThisProject/repos/data/raw/foo/bar.spec?at=refs%2Fheads%2FTheBranchOfInterest

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

echo "myUser:myPass123"| base64
bXlVc2VyOm15UGFzczEyMwo=

curl -H 'Authorization: Basic bXlVc2VyOm15UGFzczEyMwo=' 'https://ourArchive.ourCompany.com/projects/ThisProject/repos/data/raw/foo/bar.spec?at=refs%2Fheads%2FTheBranchOfInterest' > bar.spec

ชุดนี้อนุญาตให้ฉันดาวน์โหลดไฟล์เดียวที่ฉันต้องการในการสร้างทุกอย่างอื่น


0

ฉันกำลังเพิ่มคำตอบนี้เป็นทางเลือกในการชำระเงินอย่างเป็นทางการหรือดำเนินการในท้องถิ่นที่คล้ายกัน สมมติว่าคุณสามารถเข้าถึงเว็บอินเตอร์เฟสของผู้ให้บริการ Git ของคุณคุณอาจจะสามารถดูไฟล์ใด ๆ ได้โดยตรงตามการกระทำที่ต้องการ ตัวอย่างเช่นใน GitHub คุณอาจใช้สิ่งที่ชอบ:

https://github.com/hubotio/hubot/blob/ed25584f/src/adapter.coffee

นี่ed25584fคืออักขระ 8 ตัวแรกจากแฮช SHA-1 ของการกระทำที่สนใจตามด้วยเส้นทางไปยังไฟล์ต้นฉบับ

Similary บน Bitbucket เราสามารถลอง:

https://bitbucket.org/cofarrell/stash-browse-code-plugin/src/06befe08

ในกรณีนี้เราวางแฮชการคอมมิตที่ท้าย URL แหล่งที่มา


-1

หากคุณต้องการดาวน์โหลดไฟล์ไม่จำเป็นต้องตรวจสอบกับ Git

GitHub Mateนั้นง่ายกว่ามากเพราะเป็นส่วนขยายของ Chrome ช่วยให้คุณคลิกไอคอนไฟล์เพื่อดาวน์โหลด ยังเปิดแหล่งที่มา


7
git! =github
jan groth

-3

ถ้าคุณได้แก้ไขเวอร์ชันภายในประเทศของไฟล์และความปรารถนาที่จะกลับไปรุ่นเดิมเก็บรักษาไว้บนเซิร์ฟเวอร์กลางนี้สามารถทำได้อย่างง่ายดายโดยใช้Git ส่วนขยาย

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

ง่าย!

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