Можно ли получить список всех хэтов больших объектов git, которые были добавлены в хранилище с помощью данного хэша коммита, с помощью инструментов командной строки git?
Да и/ или нет: вы должны точно определить, что вы подразумеваете под добавленным в хранилище .
Предположим, например, что я начинаю с полностью пустого хранилища:
$ mkdir foo && cd foo && git init
Initialized empty Git repository in ...
Теперь я создаю README.md
и git add
it и фиксирую:
$ echo for testing > README.md
$ git add README.md
$ git commit -m initial
[master (root-commit) 19278e9] initial
1 file changed, 1 insertion(+)
create mode 100644 README.md
README.md
является BLOB-объектом и его хэш-идентификатором:
$ git rev-parse HEAD:README.md
43b18adf702be62761e3affd85c4c3ee5c396be7
Позже янапишите новый файл:
$ echo for testing > newfile.txt
$ git add newfile.txt
$ git commit -m 'add new file'
[master 5521a02] add new file
1 file changed, 1 insertion(+)
create mode 100644 newfile.txt
Если мы посмотрим на этот коммит, то увидим новый файл. Если мы посмотрим на это с git show --raw
, то увидим его в формате git diff-tree
:
$ git show --raw
commit 5521a02ce1bc4f147d0fa39a178512476764dd66 (HEAD -> master)
Author: Chris Torek <chris.torek gmail.com>
Date: Fri Oct 18 14:10:55 2019 -0700
add new file
:000000 100644 0000000 43b18ad A newfile.txt
Это похоже на большой двоичный объект, который был добавлен в хранилище , но подождитеесть что-то очень знакомое в 43b18ad
:
$ git rev-parse HEAD:newfile.txt
43b18adf702be62761e3affd85c4c3ee5c396be7
Да, это тот же самый хэш-идентификатор , что и README.md
:
$ git ls-tree -r HEAD
100644 blob 43b18adf702be62761e3affd85c4c3ee5c396be7 README.md
100644 blob 43b18adf702be62761e3affd85c4c3ee5c396be7 newfile.txt
Это один шарик,но два файла. Это действительно недавно добавленное?
Если ваш ответ на вышеприведенный ответ «да, он новый, хотя и старый», это может ответить на этот второй вопрос. Если ваш ответ «нет, это не ново», как насчет коммита, который повторно вводит BLOB-объект, который был удален в предыдущем коммите? Или, если два коммита I
и J
, выполненные параллельно на двух ветвях:
I <-- br1
/
...--G--H
\
J <-- br2
оба представляют один и тот же BLOB-объект , который фактически добавляет его как полностью новый,а какой просто дублирует другой?
В общем, если вы хотите все новые , вам придется пройти весь граф коммитов, осматривая дерево каждого коммита (см. git ls-tree -r
)и выберите, какие коммиты сначала вводят идентификатор объекта BLOB-объекта, которого нет в каком-либо ранее (родительском и / или дато-и-временном) объекте фиксации. Если вы хотите «вновь добавить как новый файл в этот коммит», проверьте коммит и его родителей, возможно, используя git diff-tree
или аналогичный. Обратите внимание, что совершенно новый файл имеет режим «все ноль» в своем родительском элементе и букву состояния A
(добавлено), в то время как файл, измененный из его родительского элемента, имеет буквенное состояние M
(модифицированный) и два ненулевых хэша. Номинально удаленный файл - файл, который существовал в родительском элементе, но больше не существует в дочернем, - имеет статусную букву D
(удалено). Если вы включите обнаружение переименования, вы получите R
значения статуса и индекса сходства;Вы можете отключить это или, по крайней мере, заставить тестирование сходства на 100%.