无需克隆即可在git仓库中浏览和显示文件

时间:2009-07-24 15:23:38

标签: git

有没有办法在git repo中浏览和显示文件而不先克隆它?我可以使用命令在svn中执行这些操作:

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

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

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

结果

fatal: Not a git repository

8 个答案:

答案 0 :(得分:67)

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

唯一可行的方法就是使用ssh来运行远程命令并返回结果,例如:

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

你想要的是可爱的功能,如果他们可以添加它,但从我读到它不是很容易,因为获取历史等需要很多信息是本地的git,并在那时你可能已经完成git fetch。

答案 1 :(得分:19)

Git是分布式版本控制系统,而Subversion是集中式(客户端 - 服务器)版本控制系统。他们的工作不同;习惯了。请阅读我的答案,在StackOverflow上解释这种差异对git equivalent of svn status -u问题的影响。

重复一点:在集中式版本控制系统(如CVS或Subversion)中,几乎所有命令都在服务器上处理,并涉及网络。在本地执行的命令非常少。请注意,要获得“svn status”和“svn diff”的良好性能,Subversion会在客户端上存储签出版本的“原始副本”,而不必为这些常见操作涉及网络传输(这意味着Subversion checkout = 2 x工作目录的大小至少)。

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

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

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

答案 2 :(得分:16)

有关如何通过某些传输协议执行此操作的信息,请查看http://git-scm.com/book/en/Git-Internals-Transfer-Protocols。请注意,这不适用于SSH上的标准git。

对于基于SSH的git,最新的服务器端git应该允许你直接从远程git-archive进行git-archive,然后你就可以进行git-archive。管道到“tar t”以获取给定提交中的所有文件的列表。

答案 3 :(得分:9)

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

答案 4 :(得分:4)

不是确切的,而是一种方式。

使用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

  3. 我希望这可能有所帮助。

答案 5 :(得分:4)

虽然您必须签出存储库,但您可以跳过使用 --no-checkout--depth 1 签出任何文件:

$ time git clone --no-checkout --depth 1 https://github.com/torvalds/linux .
Cloning into '.'...
remote: Enumerating objects: 75646, done.
remote: Counting objects: 100% (75646/75646), done.
remote: Compressing objects: 100% (71197/71197), done.
remote: Total 75646 (delta 6176), reused 22237 (delta 3672), pack-reused 0
Receiving objects: 100% (75646/75646), 201.46 MiB | 7.27 MiB/s, done.
Resolving deltas: 100% (6176/6176), done.

real    0m46.117s
user    0m13.412s
sys     0m19.641s

虽然只有一个 .git 目录:

$ ls -al
total 0
drwxr-xr-x   3 root  staff    96 Dec 26 23:57 .
drwxr-xr-x+ 71 root  staff  2272 Dec 27 00:03 ..
drwxr-xr-x  12 root  staff   384 Dec 26 23:58 .git

您可以通过以下方式获取目录列表:

$ git ls-tree --full-name --name-only -r HEAD | head
.clang-format
.cocciconfig
.get_maintainer.ignore
.gitattributes
.gitignore
.mailmap
COPYING
CREDITS
Documentation/.gitignore
Documentation/ABI/README

或通过以下方式获取文件数:

$ git ls-tree -r HEAD | wc -l
   71259

或通过以下方式获取总文件大小:

$ git ls-tree -l -r HEAD | awk '/^[^-]/ {s+=$4} END {print s}'
1006679487

答案 6 :(得分: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固有的分散特性。

答案 7 :(得分:1)

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

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