Есть ли способ увидеть, как размер файла изменился во времени в репозитории git? Я хочу посмотреть, как мой файл main.js (который представляет собой комбинацию нескольких файлов и уменьшен) со временем вырос и сжался.Как просмотреть историю файлов одного файла в репозитории git?
ответ
Вы можете создать скрипт, который использует вывод из git show --pretty=raw <commit>
, чтобы получить дерево, а затем использует git ls-tree -r -l
для получения желаемого блоба, включая размер файла.
В случае, если у вас есть рубин и grit камень установлен, вот небольшой скрипт, я бросил вместе:
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
Пример использования (имя файла сценария файла size.rb), покажет вам историю somedir/некий-файл:
myproject$ ruby file-size.rb somedir/somefile
Хотя команды, как git log <filename>
, git whatchanged
и т.д. могут показать историю, относящиеся к этому файлу, я не видел нигде ни в одном встроенной или пользовательской довольно форматирует вариант, который показывает размер (к сожалению, опция --log-size
является только для сообщений журнала!).
Однако вы можете получить приблизительное представление о размере, увидев общее количество строк, добавленных и удаленных в каждой фиксации. Вы можете визуализировать его с помощью команды git log --stat <filename>
, которая использует знаки «плюс» и «минус». Или используйте git log --numstat <filename>
, чтобы собрать количество строк, добавленных или удаленных в каждой фиксации, и использовать числа в некоторой другой визуализации.
Вы можете использовать либо git ls-tree -r -l <revision> <path>
, чтобы получить размер блоб при данной ревизии, например,
$ git ls-tree -r -l v1.6.0 gitweb/README 100644 blob 825162a0b6dce8c354de67a30abfbad94d29fdde 16067 gitweb/README
Размер блока в этом примере равен '16067'. Недостатком этого решения является то, что git ls-tree
может обрабатывать только одну ревизию сразу.
Вместо этого вы можете использовать git cat-file --batch-check < <list-of-objects>
, подавая ему идентификаторы blob. Если местоположение файла не изменилось в истории (файл не был перемещен), вы можете использовать git rev-list <starting-point> -- <path>
, чтобы получить список изменений, затрагивающих данный путь, перевести их в имена капель, используя <revision>:<path>
расширенный синтаксис SHA-1 (см. git-rev-parse manpage) и подайте его на git cat-file
. Пример:
$ git rev-list -5 v1.6.0 -- gitweb/README | sed -e 's/$/:gitweb\/README/g' | git cat-file --batch-check 825162a0b6dce8c354de67a30abfbad94d29fdde blob 16067 6908036402ffe56c8b0cdcebdfb3dfacf84fb6f1 blob 16011 356ab7b327eb0df99c0773d68375e155dbcea0be blob 14248 8f7ea367bae72ea3ce25b10b968554f9b842fffe blob 13853 8dfe335f73c223fa0da8cd21db6227283adb95ba blob 13801
Вывести вывод 'ls-tree' на' awk '{print $ 4 "" $ 5}' ', чтобы получить только размер и имя файла. – l0b0
Создайте файл с именем .gitattributes
и добавьте следующую строку:
main.js -diff
Это выключит построчное сравнение для main.js
. Теперь запустите следующую команду:
git log --stat main.js
Журнал будет включать в себя строки, как
main.js | Bin 4316 -> 4360 bytes
После того как вы закончите, вы, вероятно, следует удалить .gitattributes
. Я не знаю, какие другие изменения в поведении git могут быть вызваны атрибутом -diff
.
Протестировано с версиями git 1.7.12.4 и 1.7.9.5.
Источник: ответ ewall и https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html#_marking_files_as_binary
В случае, если это использования для кого-то, этот скрипт покажет размер данного файла в различных фиксаций:
git log <file_name> | grep "^commit" | cut -f2 -d" " | while read hash; do
echo -n "$hash -- "
git show $hash:<file_path_off_of_git_root_without_leading_slash> | wc -c
done
В Windows я использую следующая команда:
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 вы радушны ...))
- 1. git просмотреть репозитории Bitbucket
- 2. Выберите историю одного файла из Git?
- 3. Git - как просмотреть историю изменений метода/функции?
- 4. Перемещение файлов в репозитории Git
- 5. Как просмотреть историю изменений для файла Mercurial?
- 6. Как сохранить историю на битбакете при перемещении файлов в репозитории
- 7. Как просмотреть историю тегов git checkout?
- 8. Как просмотреть историю получения git-репо?
- 9. Как очистить историю Git?
- 10. Как просмотреть репозитории GIT на сервере?
- 11. Git - показать историю файла?
- 12. Как просмотреть полную историю файла в P4V?
- 13. Как просмотреть историю кода формы?
- 14. Защита файлов в репозитории git
- 15. Защита файлов в репозитории git
- 16. Перенести историю SVN в GIT для определенных файлов
- 17. Как запустить команды Git в удаленном репозитории
- 18. GIT: Как просмотреть различные графические статусы на самообслуживаемом репозитории GIT?
- 19. Как удалить историю одного файла в git, оставив только самую последнюю версию?
- 20. Откат одного файла в git в удаленном репозитории
- 21. Git: показать историю одного файла, в том числе слияния
- 22. Git diff одного файла из двух ревизий в удаленном репозитории
- 23. Как просмотреть журнал git в Emacs?
- 24. Git - просмотреть историю для определенного подмодуля с соответствующими хэшами
- 25. Просмотреть историю в GitHub после переименования папки
- 26. git diff файлы не в репозитории против файлов в репозитории
- 27. Как просмотреть историю git в коде Visual Studio?
- 28. Уникальный идентификатор файла в репозитории Git
- 29. Как просмотреть все теги в репозитории git (более 29)?
- 30. Как просмотреть все ветки в удаленном репозитории git
Принимал мне минуту, чтобы выяснить, как заставить его использовать наждачную камень после его установки (пути вещь), но это работает чудесно. Спасибо. – Echo
Я добавил пример использования, рад, что он работает. :) – igorw
Незначительное предложение: изменить 'commits = repo.log ('master', filename)' to commits = repo.log ('HEAD', filename) ', чтобы показать файловую систему на основе того, где вы сейчас находитесь (HEAD) вместо предположения хозяина. Разумеется, разрешение споров было бы круто, но это больше похоже на мышление, чем у меня сейчас. ;-) –