Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查看git存储库中单个文件的文件大小历史记录?_Git - Fatal编程技术网

如何查看git存储库中单个文件的文件大小历史记录?

如何查看git存储库中单个文件的文件大小历史记录?,git,Git,在git存储库中,是否可以查看文件大小随时间的变化?我想看看我的main.js文件(它是几个文件的组合,并且是缩小的)是如何随着时间的推移而增长和收缩的。虽然像git log、git whatchanged等命令可以显示与该文件相关的历史记录,但无论是内置格式还是自定义格式,我都看不到显示大小的选项(遗憾的是,--log size选项仅用于日志消息!) 但是,您可以通过查看每次提交中添加和删除的行的总数来大致了解大小。您可以使用使用加号和减号的命令git log--stat对其进行可视化。或者使

在git存储库中,是否可以查看文件大小随时间的变化?我想看看我的main.js文件(它是几个文件的组合,并且是缩小的)是如何随着时间的推移而增长和收缩的。

虽然像
git log
git whatchanged
等命令可以显示与该文件相关的历史记录,但无论是内置格式还是自定义格式,我都看不到显示大小的选项(遗憾的是,
--log size
选项仅用于日志消息!)


但是,您可以通过查看每次提交中添加和删除的行的总数来大致了解大小。您可以使用使用加号和减号的命令
git log--stat
对其进行可视化。或者使用
git log--numstat
收集每次提交中添加或删除的行数并使用这些数字在其他一些可视化中。

您可以创建一个脚本,该脚本使用git show--pretty=raw的输出获取树,然后使用git ls tree-r-l获取您要查找的blob,包括文件大小

如果您安装了ruby和gem,下面是我编写的一个小脚本:

require 'grit'

if ARGV.size < 1
  puts 'usage: file-size FILE'
  puts 'run from within the git repo root'
  exit
end

filename = ARGV[0].to_s

repo = Grit::Repo.new('.')
commits = repo.log('master', filename)
commits.each do |commit|
  blob = commit.tree/filename
  puts "#{commit} #{blob.size} bytes"
end

您可以使用
git-ls-tree-r-l
获得给定版本的blob大小,例如

$ git ls-tree -r -l v1.6.0 gitweb/README 100644 blob 825162a0b6dce8c354de67a30abfbad94d29fdde 16067 gitweb/README
创建一个名为
.gittributes
的文件,并添加以下行:

main.js -diff
这将关闭
main.js的基于行的差异。现在运行以下命令:

git log --stat main.js
cmd /c "@echo off & for /l %N in (1 1 30) do git ls-tree -r -l HEAD~%N "C:\path\to\file.txt"
日志将包括以下行:

main.js | Bin 4316 -> 4360 bytes
完成后,您可能应该删除
.gittributes
。我不知道
-diff
属性可能导致git行为的其他变化

使用git版本1.7.12.4和1.7.9.5进行测试


来源:ewall的答案和

如果这对某人有用,此脚本将在不同的提交中显示给定文件的大小:

git日志| grep“^commit”| cut-f2-d“|读取哈希时;do
echo-n“$hash--”
git show$hash:| wc-c
完成

在Windows上,我正在使用以下命令:

git log --stat main.js
cmd /c "@echo off & for /l %N in (1 1 30) do git ls-tree -r -l HEAD~%N "C:\path\to\file.txt"
它将显示最新30个版本中每个版本的大小


如果有人可以将其转换为Linux命令,欢迎使用…)

这里有一个Bash函数,它将以以下格式报告随时间变化的大小

 LoC  Date                       Commit ID   Subject
 942  2019-08-31 18:09:34 +0200  35fc67c122  Declare some XML namespaces in replacement of OGCPrefixMapper, which has been removed from Apache SIS. https://issues.apache.org/jira/browse/SIS-126
 943  2019-08-09 16:52:29 +0200  e8438ab869  fix(GML): fix relative path resolving inside a jar
 934  2019-08-05 15:37:46 +0200  1e0c0b03c4  fix(GML): fix all test cases
 932  2019-07-30 15:54:53 +0200  fddea5db24  feat(GML): work on fallback for non-xsd Feature store
 932  2019-07-23 16:40:23 +0200  8d9a6a7dd0  feat(GML): improve support for custom XML mappings
 932  2019-06-26 15:18:43 +0200  43ea6e0bd7  feat(GML): add concurrency support for read/write operations
 932  2019-06-21 09:27:41 +0200  07a9993b4b  feat(GML): support group reference min/max occurs attributes
 932  2019-06-21 09:27:41 +0200  352a9104ae  feat(GML): fix resolving local files xsd paths
 919  2018-06-08 15:41:26 +0200  01ac7538e7  Merge branch 'master' into sis-migration
 919  2018-05-16 16:40:04 +0200  16fe7590c5  fix(JAXP): various fix for  WFS 2.0.0
 912  2018-04-11 10:09:22 +0200  bf3a38bdc4  chore(*): update JTS version 1.15.0
 912  2017-11-09 20:15:23 +0100  bc14dc4be1  fix(Client): fix minor problems on WFS querying
 901  2017-10-20 11:41:43 +0200  f686d7ff15  feat(Storage): add support for GML 2.1.2
 882  2017-05-16 23:07:31 +0200  f20c34c1e2  refactor(Feature): renamed the Geotk flavor of org.apache.sis.feature package as org.geotoolkit.feature.
以下是函数:

git-log-size() {
    git rev-list HEAD -- "$1" | while read cid; do
        git cat-file blob "$cid:$1" | wc -l | tr -d '\n'
        echo -n $'\t'
        git log -1 "--pretty=%ci%x09%h%x09%s" $cid
    done | column -t -s$'\t'
}
它不是特别有效率,但确实起到了作用。它使用一些非常常见的实用程序(wc、tr、column)

大小以代码行(LoC)的形式报告,因为这是软件开发中常用的度量标准,如果您喜欢其他东西,只需更改wc的“-l”选项即可

以下是如何称呼它:

git-log-size <path>
git日志大小
简单地做:
git日志——stat/path/to/file

结果:

按版本列出文件大小的Bash函数:

function git-filehist() {
  for rev in $(git rev-list HEAD -- $1); do
    git ls-tree -r -l $rev $1
  done
}

我花了一分钟的时间来弄清楚如何在安装之后让它使用砂砾宝石(路径的事情),但它工作得非常好。谢谢。小建议:将
commits=repo.log('master',filename)
更改为commits=repo.log('HEAD',filename)`以便根据您当前所在的位置(HEAD)显示文件系统,而不是假定为master。当然,允许争论是很酷的,但这比我现在的想法要多另外,插入
#/usr/bin/env ruby
作为第一行,使其可执行,将其命名为
git file size
,而不是
file size.rb
,并放入bin-PATH-y目录(例如,我使用
~/bin/
来处理许多类似这样的自定义内容),然后现在只需
git file size some file.png
,就好像它是git的一部分!通过管道将
ls树
输出传输到
awk'{print$4”“$5}'
,只获取大小和文件名。这正是我想要的,因为我还需要提交的时间戳。谢谢:)谢谢,这个很有魅力!用法说明:从存储库的根目录调用
git log size