เรียกดูและแสดงไฟล์ใน git repo โดยไม่ต้องโคลน


107

มีวิธีเรียกดูและแสดงไฟล์ใน git repo โดยไม่ต้องโคลนก่อนหรือไม่? ฉันสามารถทำได้ใน svn โดยใช้คำสั่ง:

svn ls / path / to / repo 
svn cat / path / to / repo / file-in-repo

ฉันควรใช้ git show แต่ทำ:

แสดง git / path / to / repo
git แสดง HEAD: / path / to / repo

ส่งผลให้

ถึงแก่ชีวิต: ไม่ใช่ที่เก็บ git

คำตอบ:


72

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

วิธีเดียวที่แท้จริงในการทำสิ่งที่คุณต้องการ (ถ้าฉันเข้าใจถูกต้อง) คือการใช้ ssh เพื่อเรียกใช้คำสั่งระยะไกลและส่งคืนผลลัพธ์เช่น:

ssh me@otherhost "cd repo && git log -n 10"

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


14
สิ่งหนึ่งที่คุณสามารถทำได้ด้วยแต่เป็นเพียงสามารถดึงข้อมูลการแก้ไขเดียวโดยผ่านgit clone --depth 1วิธีนี้หลีกเลี่ยงการดึงประวัติจำนวนมากที่อาจเกิดขึ้นและเพียงพอที่จะตอบคำถามเช่น "ไฟล์ใดabcdef1234567890บ้างที่มีอยู่ในการแก้ไข"
ctrueden

21

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

ย้ำตัวเองอีกนิด: ในระบบควบคุมเวอร์ชันส่วนกลาง (เช่น CVS หรือ Subversion) คำสั่งเกือบทั้งหมดจะถูกประมวลผลบนเซิร์ฟเวอร์และเกี่ยวข้องกับเครือข่าย มีคำสั่งเพียงไม่กี่คำสั่งในเครื่อง โปรดทราบว่าเพื่อให้มีประสิทธิภาพที่ดีของ "svn status" และ "svn diff" Subversion จะเก็บ 'สำเนาเก่า' ของเวอร์ชันเช็คเอาต์ไว้บนไคลเอนต์เพื่อไม่ต้องเกี่ยวข้องกับการถ่ายโอนเครือข่ายสำหรับการดำเนินการทั่วไปเหล่านั้น (ซึ่งหมายความว่า Subversion checkout = 2 x ขนาดของไดเร็กทอรีการทำงานเป็นอย่างน้อย)

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

จำนวนคำสั่งที่คุณสามารถดำเนินการบนเซิร์ฟเวอร์มี จำกัด

  • คุณสามารถแสดงรายการอ้างอิงทั้งหมดบนรีโมตด้วย " git ls-remote <URL>"
  • คุณสามารถรับสแนปชอตของ (บางส่วน) ของที่เก็บ (หากเซิร์ฟเวอร์ระยะไกลเปิดใช้งาน) ด้วย
    " git archive --remote = <URL> HEAD"
  • คุณสามารถโคลนคอมมิตสุดท้ายได้เพียงไม่กี่ครั้งเท่านั้น (เรียกว่า "โคลนนิ่งตื้น") ด้วย
    " git clone --depth = 1 <URL>"
  • หากเซิร์ฟเวอร์จัดเตรียมเว็บอินเตอร์เฟส git ให้กับที่เก็บคุณสามารถใช้เพื่อเรียกดูได้

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

12
เห็นด้วยตำแหน่งที่จาคุบรับนั้นมีข้อ จำกัด อย่างมาก การเสียชื่อเสียงมากกว่าหนึ่งครั้งเพื่อชี้เรื่องนี้
ctpenrose

9
ฉันไม่ชอบน้ำเสียง "คุ้นเคยกับสิ่งนั้น" แต่เมื่ออ่านจนจบฉันพบวิธีแก้ปัญหาปัจจุบันของฉัน - เพื่อดูว่ามีอะไรอยู่ในที่เก็บ 110 ฉันมี git เดียว แต่ไม่มีการเข้าถึง ssh หรือเชลล์และสิ่งใดคือ ทั้งหมดอาจจะค่อนข้างใหญ่บาง 12GB หรือมากกว่านั้น ดังนั้นการโคลนที่มีความลึกลดลงอย่างน้อยก็ช่วยให้เห็นเฉพาะประวัติที่น่าสนใจล่าสุดเท่านั้น และทำให้ git repo มีขนาดเล็กที่สุด
Henning

3
ฟังก์ชันดังกล่าวจะดีหากมีเครื่องมือตรวจสอบโค้ดที่คุณไม่ต้องการ repo ทั้งหมดเพียงแค่บันทึกการเปลี่ยนแปลงก็เพียงพอแล้ว
Lukasz Lenart

2
@Henning ใช่มั้ยฉันเดาว่าคุณสามารถเรียกมันว่าโทน "git used to that" LOL
SN

17

โปรดดูที่http://git-scm.com/book/en/Git-Internals-Transfer-Protocolsสำหรับข้อมูลเกี่ยวกับวิธีดำเนินการนี้ในโปรโตคอลการขนส่งบางอย่าง โปรดทราบว่าสิ่งนี้ใช้ไม่ได้กับคอมไพล์มาตรฐานบน SSH

สำหรับคอมไพล์ผ่าน SSH คอมไพล์ฝั่งเซิร์ฟเวอร์ที่เป็นปัจจุบันควรช่วยให้คุณสามารถคอมไพล์ไฟล์เก็บถาวรได้โดยตรงจากรีโมตซึ่งคุณสามารถเช่นไพพ์ไปที่ "tar t" เพื่อรับรายชื่อไฟล์ทั้งหมดในคอมมิตที่กำหนด


13

GitHub เข้ากันได้กับ svn ดังนั้นคุณสามารถใช้ svn ls

svn ls https://github.com/user/repository.git/branches/master/

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

git archive --remote=git@bitbucket.org:repository HEAD directory | tar -t

6
อย่าสับสนระหว่าง Git กับ GitHub :)
LR

นอกจากนี้ยังรู้สึกค่อนข้างเปราะบาง - ทำงานบน repos จำนวนมาก (ประมาณ 100) ฉันได้รับข้อผิดพลาดต่างๆจาก svn: "ไม่สามารถรับรายการที่ไม่ใช่ไดเรกทอรี" "ข้อผิดพลาดเซิร์ฟเวอร์ภายใน 500" "ไม่มีข้อมูลรับรองเพิ่มเติม"
MichaelChirico

5

ไม่ใช่สิ่งที่แน่นอน แต่เป็นวิธีการรอบ ๆ

ใช้ GitHub Developer API

  1. การเปิดสิ่งนี้จะทำให้คุณได้รับการกระทำล่าสุด

    https://api.github.com/repos/learningequality/ka-lite/commits

    คุณสามารถรับรายละเอียดการคอมมิตเฉพาะได้โดยการแนบแฮชคอมมิตที่ท้าย url ด้านบน

  2. ไฟล์ทั้งหมด (คุณต้องการ sha สำหรับต้นไม้หลัก)

    https://api.github.com/repos/learningequality/ka-lite/git/trees/7b698a988683b161bdcd48a949b01e2b336b4c01

ฉันหวังว่านี่อาจช่วยได้


17
อย่าสับสนระหว่าง Git กับ GitHub - ฉันเชื่อว่าคำถามดั้งเดิมเกี่ยวกับ Git เอง การติดตั้ง Git / โฮสติ้ง (GitHub / BitBucket / Stash) อาจมีความเป็นไปได้ต่างๆในที่เก็บเบราว์เซอร์
Krzysztof Wolny

Good idea @Anurag Kanungo คิดนอกกรอบ😉
eonist

2

สิ่งนี้อาจถูกมองว่าสกปรกสำหรับบางคน แต่วิธีแก้ปัญหาที่ใช้ได้จริงในกรณีของที่เก็บ github คือการสร้างสคริปต์เช่น "git-ls":

#!/bin/sh
remote_url=${1:? "$0 requires URL as argument"}
curl -s $remote_url | grep js-directory-link | sed "s/.* title=\"\(.*\)\".*/\1/"

ทำให้สามารถใช้งานได้และเข้าถึงได้แน่นอน: chmod a+x git-ls; sudo cp git-ls /usr/local/bin. ตอนนี้คุณเพียงแค่เรียกใช้ตามที่คุณต้องการ:

git-ls https://github.com/mrquincle/aim-bzr
git-ls https://github.com/mrquincle/aim-bzr/tree/master/aim_modules

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


ฉันไม่ได้รับผลลัพธ์ใด ๆ กับสิ่งนี้ curl ดูเหมือนจะไม่คืนอะไรเลย
Matthew อ่าน

ตอนนี้ฉันจะแนะนำวิธี api จาก Anarug อย่างแน่นอน วิธีนี้ยังคงใช้ได้:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum

-1

หากคุณทราบสาขาระยะไกลที่ต้องการตรวจสอบคุณสามารถค้นหาข้อมูลล่าสุดได้ทาง:

git ls-tree -r <remote_branch> --name-only

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