ฉันจะเช็คเอาท์ไฟล์เดียวจาก repo git ได้อย่างไร
ฉันจะเช็คเอาท์ไฟล์เดียวจาก repo git ได้อย่างไร
คำตอบ:
เดิมผมกล่าวถึงในปี 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 - ในแผนผังการทำงาน
git config core.sparsecheckout true
).git/info/sparse-checkout
ไฟล์หากต้องการอ่านแผนผังการทำงานอีกครั้ง:
$ git read-tree -m -u HEAD
ด้วยวิธีนี้คุณจะได้ต้นไม้ทำงานรวมถึงสิ่งที่คุณต้องการอย่างแม่นยำ (แม้ว่าจะเป็นไฟล์เดียวเท่านั้น)
คะแนนRichard Gomes ( ในความคิดเห็น ) ถึง " ฉันจะโคลนดึงหรือชำระเงินเบาบางไดเรกทอรีเดียวหรือรายการไดเรกทอรีจากพื้นที่เก็บข้อมูล git ได้อย่างไร "
ฟังก์ชั่นทุบตีที่หลีกเลี่ยงการดาวน์โหลดประวัติซึ่งดึงข้อมูลสาขาเดียวและดึงรายชื่อไฟล์หรือไดเรกทอรีที่คุณต้องการ
git archive
ตอนนี้
ก่อนอื่นคัดลอก repo ด้วยตัวเลือก -n ซึ่งจะระงับการเช็คเอาต์เริ่มต้นของไฟล์ทั้งหมดและตัวเลือก - ความลึก 1 ซึ่งหมายความว่าจะได้รับการแก้ไขล่าสุดของแต่ละไฟล์เท่านั้น
git clone -n git://path/to/the_repo.git --depth 1
จากนั้นลองดูเฉพาะไฟล์ที่คุณต้องการ:
cd the_repo
git checkout HEAD name_of_file
-n
เนื่องจากแผนผังการทำงานและดัชนีจะซิงค์กัน นั่นคือเนื้อหาทั้งหมดแสดงว่าถูกลบ คุณมีอย่างใดอย่างหนึ่งหรือgit reset HEAD
git checkout HEAD file
นอกจากนี้ยังเป็นเรื่องยากที่จะทำงานกับที่เก็บข้อมูล ณ จุดนี้ถ้าคุณไม่เข้าใจวิธีการใช้งานคอมไพล์
rm -rf .git
เข้าไปในสคริปต์ของ NickMoore จะช่วยทำความสะอาดร่องรอยทั้งหมดของ repo ที่ถูกโคลนและอาจทำให้ Jefromi กังวลเกี่ยวกับการใช้ repo ที่ยากต่อการใช้งาน ทำให้มีประโยชน์มากสำหรับฉันสำหรับแอปพลิเคชั่นหลายตัวเช่นความท้าทายของฉันในวันนี้เพื่อสร้าง hook การโพสต์เพื่ออัปเดตเวอร์ชันของ hook การโพสต์รับอื่นโดยอัตโนมัติ
git
ไม่ดีที่สุดสำหรับงานประเภทนี้) คำตอบนี้ยังเป็นที่ถูกต้องสำหรับคำถามนี้หรือนี้เป็นที่นิยมอีกคนหนึ่งและคนอื่น ๆ อีกมากมาย: การเปลี่ยนแปลงไปname_of_file
name_of_folder
Git ในปัจจุบัน (2014s) เสนอsubmodulesให้กับเจ้าของ repo ข้อเสนอที่เป็นมิตรสำหรับผู้ใช้ repo
หากคุณมีสำเนาของ git repo อยู่แล้วคุณสามารถเช็คเอาท์รุ่นของไฟล์โดยใช้ a git log
เพื่อค้นหา hash-id (เช่น 3cdc61015724f9965575ba954c8cd4232c8b42e4) และพิมพ์เพียงแค่:
git checkout hash-id path-to-file
นี่คือตัวอย่างจริง:
git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /var/www/css/page.css
path-to-file
เป็นไดเรกทอรีและปัจจุบันHEAD
มีไฟล์บางไฟล์ในขณะที่target
ไม่มี (หรือกลับกัน) ไฟล์นี้จะอัปเดตไฟล์ไม่ถูกต้อง มีวิธีจัดการไหม?
โดยทั่วไปแล้วจะไม่สามารถดาวน์โหลดได้เพียงไฟล์เดียวgit
โดยไม่ต้องดาวน์โหลดที่เก็บทั้งหมดตามคำแนะนำในคำตอบแรก เป็นเพราะ Git ไม่ได้จัดเก็บไฟล์อย่างที่คุณคิด (ตามที่ CVS / SVN ทำ) แต่มันจะสร้างไฟล์ตามประวัติทั้งหมดของโครงการ
แต่มีวิธีแก้ไขปัญหาเฉพาะบางกรณี ตัวอย่างด้านล่างด้วยตัวยึดสำหรับuser
, project
, ,branch
filename
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)
อีกทางหนึ่ง
wget
คำตอบที่ยอดเยี่ยมและความเรียบง่ายกลับมาพร้อมกับความสุข ขอบคุณชาย
git checkout branch_or_version - พา ธ / ไฟล์
ตัวอย่าง: git checkout HEAD -- main.c
git-checkout
อธิบายสิ่งที่เป็นส่วนที่เกี่ยวข้องของหน้าคนสำหรับ
ตอนนี้เราทำได้แล้ว! เนื่องจากนี่เป็นผลลัพธ์แรกบน 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
github.com
HEAD
หรือไม่master
HEAD:directory
git archive --remote=git@bitbucket.org:user/repo branch:path/to file | tar -x
ทำงานใน 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 ในบางจุดก่อน)
git fetch some_remote
ก่อนใช่ไหม?
ง่ายมาก:
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 ที่สอนฉันจากโพสต์บล็อกนี้
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 clone
shenanigans ของโปรโตคอล: วิธีการโคลนที่เก็บ git ในพื้นที่ที่มีเส้นทางสัมพัทธ์อย่างไร
รูปแบบของการจัดทำเอกสารเกี่ยวกับ--filter
man 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
เหล่านั้นจะปรากฏในรายการไฟล์ที่หายไป
คุณสามารถทำได้โดย
git archive --format=tar --remote=origin HEAD | tar xf -
git archive --format=tar --remote=origin HEAD <file> | tar xf -
สมมติว่าชื่อไฟล์คือ 123.txt สิ่งนี้ใช้ได้กับฉัน:
git checkout --theirs 123.txt
หากไฟล์อยู่ในไดเรกทอรี A ตรวจสอบให้แน่ใจว่าได้ระบุอย่างถูกต้อง:
git checkout --theirs "A/123.txt"
มีสองรูปแบบสำหรับสิ่งที่ได้รับ:
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
สิ่งเหล่านี้เขียนไฟล์ไปยังเอาต์พุตมาตรฐาน
ในคอมไพล์คุณไม่ได้ไฟล์ 'ชำระเงิน' ก่อนที่คุณจะอัปเดต - ดูเหมือนว่านี่คือสิ่งที่คุณเป็นหลังจาก
ระบบจำนวนมากเช่น clearcase, csv และอื่น ๆ กำหนดให้คุณต้อง 'ชำระเงิน' ไฟล์ก่อนจึงจะสามารถทำการเปลี่ยนแปลงได้ Git ไม่ต้องการสิ่งนี้ คุณโคลนที่เก็บแล้วทำการเปลี่ยนแปลงในสำเนาของที่เก็บในเครื่องของคุณ
เมื่อคุณอัปเดตไฟล์แล้วคุณสามารถทำได้:
git status
เพื่อดูว่ามีการแก้ไขไฟล์ใดบ้าง คุณเพิ่มสิ่งที่คุณต้องการกระทำindex
ก่อน ( index
เหมือนรายการที่จะเช็คอิน):
git add .
หรือ
git add blah.c
จากนั้นgit status
จะแสดงให้คุณเห็นว่าไฟล์ใดบ้างที่ถูกแก้ไขและไฟล์ใดindex
พร้อมที่จะให้คำแนะนำหรือเช็คอิน
ในการส่งไฟล์ไปยังสำเนาที่เก็บของคุณให้ทำ:
git commit -a -m "commit message here"
ดูgit
เว็บไซต์สำหรับลิงก์ไปยังคู่มือและคำแนะนำ
git format-patch
เพื่อสร้างโปรแกรมแก้ไขสำหรับการส่ง ( git format-patch -1
จะสร้างโปรแกรมปะแก้ สำหรับการกระทำล่าสุดของคุณ)
นี่คือโซลูชันที่สมบูรณ์แบบสำหรับการดึงและผลักดันไฟล์เฉพาะภายในที่เก็บ git:
git clone --no-checkout <git url>
git reset
git checkout origin/master <path to file>
git add <path to file>
git commit -m <message text>
git push
ดูลิงก์สำหรับข้อมูลเพิ่มเติมบางส่วน
ดูเหมือนว่าคุณกำลังพยายามถ่ายทอดความคิดจากการควบคุมเวอร์ชันรวมศูนย์ซึ่งคอมไพล์โดยธรรมชาติไม่ได้ - มันกระจาย หากคุณต้องการทำงานกับพื้นที่เก็บข้อมูล git คุณก็จะทำการโคลน แล้วคุณมีทั้งหมดของเนื้อหาของต้นไม้การทำงานและทั้งหมดของประวัติศาสตร์ (ดีทุกอย่างที่นำไปสู่ปลายของสาขาในปัจจุบันอย่างน้อย) ไม่ได้เป็นเพียงไฟล์เดียวหรือภาพรวมจากเดียวกระทำ
git clone /path/to/repo
git clone git://url/of/repo
git clone http://url/of/repo
หากคุณต้องการไฟล์เฉพาะจากสาขาเฉพาะจากที่เก็บ 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 -
ฉันไม่เห็นสิ่งที่ทำงานให้ฉันอยู่ที่นี่ดังนั้นฉันจะรวมมันควรมีใครอยู่ในสถานการณ์ของฉัน
สถานการณ์ของฉันฉันมีที่เก็บระยะไกลบางทีอาจเป็น 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
ชุดนี้อนุญาตให้ฉันดาวน์โหลดไฟล์เดียวที่ฉันต้องการในการสร้างทุกอย่างอื่น
ฉันกำลังเพิ่มคำตอบนี้เป็นทางเลือกในการชำระเงินอย่างเป็นทางการหรือดำเนินการในท้องถิ่นที่คล้ายกัน สมมติว่าคุณสามารถเข้าถึงเว็บอินเตอร์เฟสของผู้ให้บริการ 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 แหล่งที่มา
หากคุณต้องการดาวน์โหลดไฟล์ไม่จำเป็นต้องตรวจสอบกับ Git
GitHub Mateนั้นง่ายกว่ามากเพราะเป็นส่วนขยายของ Chrome ช่วยให้คุณคลิกไอคอนไฟล์เพื่อดาวน์โหลด ยังเปิดแหล่งที่มา
git
! =github
ถ้าคุณได้แก้ไขเวอร์ชันภายในประเทศของไฟล์และความปรารถนาที่จะกลับไปรุ่นเดิมเก็บรักษาไว้บนเซิร์ฟเวอร์กลางนี้สามารถทำได้อย่างง่ายดายโดยใช้Git ส่วนขยาย
ง่าย!