Duyệt và hiển thị các tệp trong git repo mà không cần sao chép


107

Có cách nào để duyệt và hiển thị tệp trong git repo mà không cần sao chép nó trước không? Tôi có thể làm những điều đó trong svn bằng cách sử dụng các lệnh:

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

Tôi được cho là có thể sử dụng git show nhưng làm:

git show / path / to / repo
git show HEAD: / path / to / repo

dẫn đến

Fat: Không phải là một kho lưu trữ git

Câu trả lời:


72

Lệnh bạn muốn là lệnh git ls-remotecho phép bạn lấy một số thông tin về các kho lưu trữ từ xa, nhưng bạn không thể hiển thị lịch sử hoặc danh sách các thư mục hoặc bất kỳ thứ gì ở cấp độ đó: về cơ bản nó chỉ cho phép bạn xem các đối tượng từ xa ở cấp rất cao (bạn có thể xem ví dụ: HEAD hiện tại và thẻ).

Cách thực sự duy nhất để làm những gì bạn muốn (nếu tôi hiểu chính xác) là sử dụng ssh để chạy lệnh từ xa và trả về kết quả, ví dụ:

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

Những gì bạn muốn sẽ là chức năng đáng yêu nếu họ có thể thêm nó, nhưng từ những gì tôi đọc được thì không dễ dàng lắm vì việc lấy lịch sử, v.v. cần rất nhiều thông tin để cục bộ thành git và tại thời điểm đó bạn cũng có thể đã thực hiện tìm nạp git .


14
Tuy nhiên, một điều bạn có thể làm git clonelà chỉ tìm nạp một bản sửa đổi duy nhất bằng cách chuyển --depth 1. Điều này tránh tìm nạp một lượng lớn lịch sử tiềm ẩn và sẽ đủ để trả lời các câu hỏi như "tệp nào có trong bản sửa đổi abcdef1234567890?"
ctrueden

21

Git là hệ thống kiểm soát phiên bản phân tán , trong khi Subversion là hệ thống kiểm soát phiên bản tập trung (máy khách-máy chủ). Chúng hoạt động khác nhau; quen với điều đó. Vui lòng đọc câu trả lời của tôi giải thích hậu quả của sự khác biệt đó đối vớisvn status -u câu hỏi tương đương git tại StackOverflow.

Lặp lại bản thân một chút: trong hệ thống kiểm soát phiên bản tập trung (như CVS hoặc Subversion) hầu như tất cả các lệnh được xử lý trên máy chủ và liên quan đến mạng. Rất ít lệnh được thực hiện cục bộ. Lưu ý rằng để có hiệu suất tốt của "trạng thái svn" và "svn diff" Cửa hàng Subversion 'bản sao nguyên sơ' của phiên bản đã kiểm tra trên máy khách, để không phải chuyển mạng cho các hoạt động phổ biến đó (điều này có nghĩa là Subversion checkout = 2 x kích thước của thư mục làm việc ít nhất).

Trong hệ thống kiểm soát phiên bản phân tán (như Git, Mercurial hoặc Bazaar), nơi bạn có bản sao cục bộ (sao chép) của toàn bộ kho lưu trữ, hầu như tất cả các lệnh đều được thực hiện trên máy khách . Rất ít lệnh yêu cầu kết nối mạng với kho lưu trữ khác (tới máy chủ).

Số lượng lệnh bạn có thể thực hiện trên máy chủ bị giới hạn.

  • Bạn có thể liệt kê tất cả các tham chiếu trên điều khiển từ xa với " git ls-remote <URL>".
  • Bạn có thể lấy ảnh chụp nhanh (một phần) của kho lưu trữ (nếu máy chủ từ xa đã bật nó) bằng
    " git archive --remote = <URL> HEAD".
  • Bạn chỉ có thể sao chép một vài lần commit cuối cùng (được gọi là "bản sao nông") với
    " git clone --depth = 1 <URL>".
  • Nếu máy chủ cung cấp giao diện web git cho kho lưu trữ, bạn có thể sử dụng nó để duyệt.

36
Đúng như bạn đang nói, nếu bạn đang duyệt một repo từ xa mà không sao chép nó trước, thì rõ ràng bạn đã quyết định rằng bạn có thể bỏ qua các khả năng ngoại tuyến của git. Vì vậy, tôi không có lý do gì để giả vờ rằng đây không phải là một tính năng hữu ích cho một số thứ, chẳng hạn như một ứng dụng khách cục bộ cho phép bạn duyệt nội dung tệp của một repo từ xa cục bộ.
LadyCailin

12
Đồng ý, vị trí mà Jakub đảm nhận là rất hạn chế. Thật đáng để mất danh tiếng hơn một lần để chỉ ra điều này.
ctpenrose,

9
Tôi không thích giọng điệu "hãy làm quen với điều đó"., Nhưng khi đọc đến cuối, tôi đã tìm thấy giải pháp cho vấn đề hiện tại của mình - muốn xem có gì trong kho lưu trữ 110 mà tôi có một git, nhưng không có quyền truy cập ssh hoặc shell và cái nào tất cả có lẽ khá lớn, khoảng 12GB hoặc hơn. Vì vậy, bản sao với độ sâu tối thiểu giúp ít nhất chỉ xem được lịch sử thú vị gần đây. và đặt git repo càng nhỏ càng tốt.
Henning

3
Chức năng như vậy sẽ rất tốt nếu có các công cụ đánh giá mã nơi bạn không cần toàn bộ repo chỉ cần ghi nhật ký với các thay đổi là đủ.
Lukasz Lenart

2
@Henning, Đúng vậy, tôi đoán bạn có thể gọi nó là giai điệu "git used to that" LOL
SN

17

Hãy xem http://git-scm.com/book/vi/Git-Internals-Transfer-Protocols để biết thông tin về cách thực hiện việc này qua một số giao thức truyền tải. Lưu ý rằng điều này sẽ không hoạt động đối với git tiêu chuẩn qua SSH.

Đối với git qua SSH, git phía máy chủ cập nhật sẽ cho phép bạn lưu trữ git trực tiếp từ điều khiển từ xa, sau đó bạn có thể chuyển sang "tar t" để lấy danh sách tất cả các tệp trong một cam kết nhất định.


13

GitHub tương thích với svn nên bạn có thể sử dụng svn ls

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

BitBucket hỗ trợ lưu trữ git để bạn có thể tải xuống kho lưu trữ tar và liệt kê các tệp đã lưu trữ. Nó không hiệu quả lắm nhưng hoạt động:

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

6
Đừng nhầm lẫn Git với GitHub :)
LR

nó cũng cảm thấy khá mong manh - chạy trên nhiều (khoảng 100) Repos, tôi nhận được lỗi khác nhau từ svn: "không thể có được mục của phi thư mục" "500 Internal Server Error" "Không thông tin nhiều hơn"
MichaelChirico

5

Không phải chính xác, nhưng một cách xung quanh.

Sử dụng API nhà phát triển GitHub

  1. Mở nó sẽ giúp bạn nhận được những cam kết gần đây.

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

    Bạn có thể lấy chi tiết cam kết cụ thể bằng cách đính kèm băm cam kết vào cuối url ở trên.

  2. Tất cả các tệp (Bạn cần sha cho cây chính)

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

Tôi hy vọng điều này có thể giúp ích.


17
Đừng nhầm lẫn Git với GitHub - tôi tin rằng các câu hỏi ban đầu là về chính Git. Cài đặt / lưu trữ Git (GitHub / BitBucket / Stash) có thể có nhiều khả năng khác nhau đối với kho lưu trữ trình duyệt.
Krzysztof Wolny

Ý tưởng tốt @Anurag Kanungo tư duy ngoài vòng cấm địa 😉
eonist

2

Điều này có thể được một số người coi là bẩn, nhưng một giải pháp rất thực tế trong trường hợp kho lưu trữ github chỉ là tạo một tập lệnh, ví dụ: "git-ls":

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

Làm cho nó thực thi và có thể truy cập tất nhiên: chmod a+x git-ls; sudo cp git-ls /usr/local/bin. Bây giờ, bạn chỉ cần chạy nó như bạn muốn:

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

Cũng biết rằng có một git instawebtiện ích cho các tệp cục bộ của bạn. Theo ý kiến ​​của tôi, để có khả năng hiển thị tệp và có một máy chủ như vậy không phá hủy bất kỳ đặc điểm phân quyền vốn có của git.


Tôi không nhận được bất kỳ kết quả với điều này. curl dường như không trả lại bất cứ điều gì.
Ma-thi-ơ Đọc

Bây giờ tôi chắc chắn sẽ giới thiệu phương pháp api từ Anarug. Mặc dù vậy, phương pháp này vẫn hoạt động:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum

-1

Nếu bạn biết chi nhánh ở xa bạn muốn kiểm tra, bạn có thể tìm hiểu thông tin mới nhất qua:

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

8
nó không hoạt động nếu bạn không bản sao repo trước đây :(
Bálint Szigeti
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.