在远程存储库上提交历史记录

Posted

技术标签:

【中文标题】在远程存储库上提交历史记录【英文标题】:Commit history on remote repository 【发布时间】:2012-12-06 04:34:45 【问题描述】:

我正在尝试访问远程存储库上的分支提交历史记录。我查看了the doc,但找不到任何有关如何使用我的本地 git 客户端访问远程 repo 的提交历史的实质性信息。

【问题讨论】:

【参考方案1】:
git log remotename/branchname

将显示该存储库中给定远程分支的日志,但仅显示您从其存储库“获取”到远程存储库的个人“副本”的日志。

请记住,您的存储库克隆将仅通过执行 git fetch 来更新其任何远程分支的状态。你不能直接连接到服务器查看那里的日志,你要做的是用git fetch下载服务器的状态,然后在本地查看远程分支的日志。

也许另一个有用的命令可能是:

git log HEAD..remote/branch

这将显示远程分支中的提交,而不是当前分支中的提交 (HEAD)。

【讨论】:

“您无法直接连接到服务器以检查那里的日志” - 这就是我遇到的问题 我只获得本地拉取的更改...注意远程的,甚至之前进行了提取。 在执行git fetch 时,您需要使用--all 从远程获取。 太糟糕了,所以我必须克隆 2GB 的对象才能查看提交日志? 嗨@TWiStErRob,您可以通过管理使用浅克隆获取的数据量来减轻痛苦(参见git-scm.com/docs/git-clone 中的--depth),然后使用(参见git-scm.com/docs/git-fetch 中的“shallow”)管理获取)。【参考方案2】:

注意。下面的“origin”用于表示克隆存储库的上游,将“origin”替换为远程存储库的描述性名称。 “远程引用”可以使用与克隆命令相同的格式。

git remote add origin <remote reference>
git fetch
git log origin/master

【讨论】:

@user1795998 远程仓库 Git URL,例如git://git.somedomain.tld/some/repo 如果您没有在远程跟踪任何分支,您在获取时不需要指定&lt;refspec&gt;(或使用fetch --all)吗? “项目供应商/诊断”是什么意思?那是存储库中的文件夹吗?另一个分支? 一个存储库可以有多个分支,但“项目”不是与 git 相关的术语,从那里混淆到在这种情况下“项目”的含义。不过,这与这个问题有什么关系? 我不相信它可以在 GIT 中做到这一点。您必须先克隆该远程存储库,然后才能针对它发出 git 日志。【参考方案3】:

一种快速的方法是使用--bare 关键字进行克隆,然后检查日志:

git clone --bare git@giturl tmpdir
cd tmpdir
git log branch

【讨论】:

【参考方案4】:

我不确定何时添加了过滤,但如果您只想获取历史记录/参考日志,这是一种排除对象 blob 的方法:

git clone --filter=blob:none --no-checkout --single-branch --branch master git://some.repo.git .
git log

【讨论】:

这是完美。鉴于其他答案,如果它能够在提供的答案旁边脱颖而出,那就太棒了。【参考方案5】:

这对我有用:

git fetch --all 
git log production/master

请注意,这会从所有遥控器中获取,即可能是您 "have to clone 2GB worth of objects just to look through the commit logs"。

【讨论】:

【参考方案6】:

您只能在本地存储库中查看日志,但是其中可以包括您已设置的所有远程的提取分支。

所以,如果你克隆一个 repo...

git clone git@gitserver:folder/repo.git

这将默认为origin/master

除了origin 之外,您还可以向此存储库添加一个遥控器,让我们添加production。从本地克隆文件夹中:

git remote add production git@production-server:folder/repo.git

如果我们想查看production 的日志,我们需要这样做:

git fetch --all 

这会从所有遥控器中获取(没有--all 的默认获取将仅从origin 获取)

获取后我们可以查看production远程的日志,你也必须指定分支。

git log production/master

所有选项都将像登录本地分支机构一样工作。

【讨论】:

【参考方案7】:

我不相信这是可能的。我相信您必须在本地克隆该远程仓库并对其执行git fetch,然后才能针对它发出git log

【讨论】:

假设您已经将 repo 克隆到本地并进行了一些更改。 .那么你想检查是否有人提交了远程仓库 如果您将此答案更改为“不可能”,那么这是最佳答案。无法使用远程 git 客户端访问远程 repo 的提交历史记录。【参考方案8】:

git 不是像svn 这样的集中式单片机,所以您有两种选择:

使用目标平台的 Web 界面(例如 GitHub REST API 或 GitLab REST API) 下载存储库并在本地显示日志

为许多不同的平台(GitHub、GitLab、BitBucket、SourceForge、Launchpad、Gogs 等)实施可能很烦人,但获取数据非常慢(我们谈论的是秒数)——没有完美的解决方案。


获取到临时目录的示例:

git clone https://github.com/rust-lang/rust.git -b master --depth 3 --bare --filter=blob:none -q .
git log -n 3 --no-decorate --format=oneline

或者:

git init --bare -q
git remote add -t master origin https://github.com/rust-lang/rust.git
git fetch --depth 3 --filter=blob:none -q
git log -n 3 --no-decorate --format=oneline origin/master

两者都针对性能进行了优化,将一个分支的 3 次提交限制为没有文件内容的最小本地副本并防止控制台输出。虽然在 fetch 期间打开连接和计算增量需要一些时间。


GitHub 示例:

GET https://api.github.com/repos/rust-lang/rust/commits?sha=master&per_page=3

GitLab 示例:

GET https://gitlab.com/api/v4/projects/inkscape%2Finkscape/repository/commits?ref_name=master&per_page=3

两者都非常快,但具有不同的界面(就像每个平台一样)。


免责声明:选择 Rust 和 Inkscape 是因为它们的大小和安全性,没有广告

【讨论】:

【参考方案9】:

这是一个 bash 函数,可以轻松查看远程日志。它需要两个可选参数。第一个是branch,默认为ma​​ster。第二个是remote,默认是staging

git_log_remote() 
  branch=$1:-master
  remote=$2:-staging
  
  git fetch $remote
  git checkout $remote/$branch
  git log
  git checkout -

例子:

 $ git_log_remote
 $ git_log_remote development origin

【讨论】:

你为什么要做git checkout $remote/branch ; git log ; git checkout -。不只是git log $remote/branch 在这里工作吗? @MichaelFirth 我刚刚检查过,确实可以。知道这真的会使辅助函数过时。谢谢!【参考方案10】:

您可以轻松获取远程服务器的日志。 方法如下:

(1) 如果通过 ssh 使用 git - 那么只需使用您的 git 登录名和密码登录到远程服务器 - 并 chdir 存储库所在的远程文件夹 - 并在您的存储库中运行“git log”命令远程服务器。

(2) 如果通过 Unix 的标准登录协议使用 git - 那么只需 telnet 到您的远程服务器并在那里执行 git log。

希望这会有所帮助。

【讨论】:

换种说法,“您无法获取远程服务器的日志,您必须使用本地 git 客户端登录并获取日志” 只需删除这个答案,它不会回答问题,也不是大多数 git 用户没有服务器外壳访问权限的原因 #2:近 30 年来,我一直在使用和破解各种 UNIX 和 Linux 发行版,这对我来说没有多大意义......

以上是关于在远程存储库上提交历史记录的主要内容,如果未能解决你的问题,请参考以下文章

sh 将git存储库及其所有分支,标记移动到新的远程存储库,保留提交历史记录

Git本地存储库提交导出

从远程 git 历史记录中删除我在本地没有的提交

如何将不相关的历史记录作为一系列新提交推送?

从存储库历史记录中删除提交 [重复]

SVN和GIT提交历史记录和代码差异