【问题标题】:Browse and display files in a git repo without cloning无需克隆即可在 git 存储库中浏览和显示文件
【发布时间】:2010-11-13 18:49:52
【问题描述】:

有没有办法在 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

结果

致命的:不是 git 存储库

【问题讨论】:

    标签: git


    【解决方案1】:

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

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

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

    如果他们可以添加它,您想要的将是可爱的功能,但从我读到的内容来看,这并不是很容易,因为获取历史等需要大量信息才能在 git 本地进行,此时您可能已经完成了一个 git 提取。

    【讨论】:

    • 不过,您可以使用git clone 做的一件事是通过传递--depth 1 仅获取一个修订版。这避免了获取潜在的大量历史记录,并且足以回答诸如“修订版abcdef1234567890中存在哪些文件?”之类的问题
    【解决方案2】:

    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 ”列出远程上的所有引用。
    • 您可以通过
      获取存储库(部分)的快照(如果远程服务器启用了它) “git archive --remote= 头部”。
    • 您只能克隆几个最后的提交(所谓的“浅克隆”)
      git clone --depth=1 ”。
    • 如果服务器提供了 git web 界面到仓库,你可以用它来浏览。

    【讨论】:

    • 尽管您是正确的,但如果您在没有先克隆它的情况下浏览远程存储库,那么显然您已经决定放弃 git 的离线功能是可以的。鉴于此,我认为没有理由假装这对于某些事情来说不是一个有用的功能,例如,允许您在本地浏览远程 repo 的文件内容的本地客户端。
    • 同意,Jakub 采取的立场是高度限制性的。指出这一点值得多次失去声誉。
    • 我不喜欢“习惯那个”的语气。但是当读到最后时,我找到了解决我当前问题的方法——想看看 110 存储库中有什么,我有一个 git,但没有 ssh或 shell 访问,这些都可能相当大,大约 12GB。因此,具有最小深度的克隆至少有助于仅查看最近的有趣历史。并使 git repo 尽可能小。
    • 如果您不需要整个 repo 的代码审查工具,只需记录更改就足够了。
    • @Henning,没错,我猜你可以称它为“git used to that”语气 LOL
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      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
      

      【讨论】:

      • 不要将 Git 与 GitHub 混淆 :)
      • 它也感觉很脆弱——在许多(大约 100 个)repos 上运行,我从 svn 收到各种错误:“无法获取非目录条目”“500 内部服务器错误”“否更多凭据”
      【解决方案5】:

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

      使用 GitHub 开发者 API

      1. 打开它会得到最近的提交。

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

        您可以通过在上述网址末尾附加提交哈希来获取具体的提交详细信息。

      2. 所有文件(主树需要 sha)

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

      我希望这会有所帮助。

      【讨论】:

      • 不要将 Git 与 GitHub 混淆——我相信最初的问题是关于 Git 本身的。 Git 安装/托管 (GitHub/BitBucket/Stash) 可以有多种浏览器存储库的可能性。
      • 好主意@Anurag Kanungo 跳出框框思考?
      【解决方案6】:

      虽然您必须签出存储库,但您可以跳过使用 --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
      

      【讨论】:

      • 这个技术的有趣怪癖:git status 报告 repo 中的所有文件都已被删除。使用 GUI 工具时,请注意它们可能会暂时锁定大型存储库!
      【解决方案7】:

      这可能被某些人认为是肮脏的,但对于 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 似乎没有返回任何东西。
      • 我现在肯定会推荐 Anarug 的 api 方法。这种方法仍然有效:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
      【解决方案8】:

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

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

      【讨论】:

      • 如果您之前不克隆 repo,它将无法正常工作:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2018-11-23
      • 2017-12-29
      相关资源
      最近更新 更多