浏览和显示git存储库中的文件而无需克隆


107

有没有一种方法可以浏览和显示git仓库中的文件而无需先克隆它?我可以使用以下命令在svn中执行这些操作:

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

我可以使用git show但可以这样做:

git show / path / to / repo
git show HEAD:/路径/到/仓库

结果到

致命的:不是git库

Answers:


72

您想要的命令git ls-remote允许您获取有关远程存储库的一些信息,但是您无法显示历史记录或列表目录或该级别的任何内容:本质上,它仅允许您以很高的级别查看远程对象(可以看到远程对象)。例如当前的HEAD和标签)。

唯一真正可行的方法(如果我理解正确的话)是使用ssh运行远程命令并返回结果,例如:

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

如果他们可以添加它,那么您想要的就是可爱的功能,但是从我的阅读来看,这并不是一件容易的事,因为获取历史记录等需要大量信息才能在git本地进行,这时您还可以进行git fetch 。


14
不过,您可以做的一件事git clone就是通过传递仅获取一个修订--depth 1。这避免了获取潜在的大量历史记录,并且足以回答诸如“哪些文件存在于修订版中abcdef1234567890?”之类的问题。
2015年

21

Git是分布式版本控制系统,而Subversion是集中式(客户端-服务器)版本控制系统。他们的工作方式不同;习惯了。请阅读我的答案,以解释在StackOverflow 上git等效svn status -u问题的区别所带来的后果。

再说一遍:在集中式版本控制系统(如CVS或Subversion)中,几乎所有命令都在服务器上处理,并且涉及网络。很少在本地执行命令。请注意,要具有良好的“ svn状态”和“ svn差异”性能,Subversion会将已检出版本的“原始副本”存储在客户端上,而不必为那些常见操作进行网络传输(这意味着Subversion检出= 2 x工作目录的大小)。

在分布式版本控制系统(如Git,Mercurial或Bazaar)中,您拥有整个存储库的本地副本(克隆),几乎所有命令都在client上执行。很少有命令需要通过网络连接到其他存储库(到服务器)。

您可以在服务器上执行的命令数量是有限的。

  • 您可以使用“ git ls-remote <URL>” 列出远程上的所有引用。
  • 您可以使用
    git archive --remote = <URL> HEAD” 获取存储库(部分)的快照(如果启用了远程服务器)。
  • 您只能使用
    git clone --depth = 1 <URL>” 来克隆最后的几次提交(即“ shallow clone”)。
  • 如果服务器为存储库提供git Web界面,则可以使用它进行浏览。

36
如您所愿,如果您没有先克隆远程仓库就浏览它,那么显然您已经决定放弃git的脱机功能是可以的。鉴于此,我没有理由假装这对于某些事情不是有用的功能,例如,允许您在本地浏览远程仓库的文件内容的本地客户端。
LadyCailin 2012年

12
同意,雅库布(Jakub)采取的立场是高度限制性的。指出这一点值得一次以上地丧失声誉。
ctpenrose

9
我不喜欢“习惯”这种语调。但是当读到最后时,我找到了解决我当前问题的方法-想要查看110存储库中的内容,我只有一个git,但是没有ssh或shell访问权限,以及全部可能很大,大约12GB。因此,深度最小的克隆至少可以帮助您了解最近的有趣历史。并使git repo尽可能小。
亨宁2014年

3
在不需要代码库的情况下,如果您不需要整个仓库,只需要记录更改,这样的功能就可以了。
Lukasz Lenart 2014年

2
@Henning,对,您猜对了,我可以称呼它为“习惯于此的git”音色
SN


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

它也感觉很脆弱-在许多(大约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 2015年

盒子外面😉好主意@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)阅读了

我现在绝对会推荐Anarug的api方法。但是,该方法仍然有效:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum 2015年

-1

如果知道要检查的远程分支,则可以通过以下方式查找最新分支:

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

8
如果你不克隆回购此前:(这是行不通的
巴林特西盖蒂
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.