Как перечислить все файлы в коммит?

Я ищу простой git команда, которая предоставляет хорошо отформатированный список всех файлов, которые были частью фиксации, заданной хэшем (SHA1), без посторонней информации.

Я пробовал:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

хотя в нем перечислены файлы, он также включает в себя ненужную информацию diff для каждого.

есть еще git команда, которая предоставит только список, который я хочу, чтобы я мог избежать разбора его из git show выход?

26 ответов


Предпочтительный Способ (потому что это сантехники command; предназначен для программирования):

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js

Еще Один Способ (менее предпочтительно для скриптов, потому что это фарфор command; предназначен для пользователя)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js

  • на --no-commit-id подавляет вывод идентификатора фиксации.
  • на --pretty аргумент указывает пустую строку формата, чтобы избежать cruft на начало.
  • на

Если вы хотите получить список измененных файлов:

git diff-tree --no-commit-id --name-only -r <commit-ish>

Если вы хотите получить список всех файлов в один коммит, вы можете использовать

git ls-tree --name-only -r <commit-ish>

Я просто предположу, что gitk не требуется для этого. В этом случае попробуйте git show --name-only <sha>.


Я лично использую комбинацию -- stat и --oneline С показать:

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD

Если вам не нравится/хотите статистику добавления/удаления, вы можете заменить -- stat С --name-only

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD

вы также можете сделать

git log --name-only

и вы можете просматривать различные коммиты, сообщения фиксации и измененные файлы.

введите q, чтобы получить приглашение обратно.


недавно мне нужно было перечислить все измененные файлы между двумя фиксациями. Поэтому я использовал эту (также специфичную для *nix) команду

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

обновление: или, как указывает Итан ниже

git diff --name-only START_COMMIT..END_COMMIT

используя --name-status также будет включать изменение (добавлено, изменено, удалено и т. д.) Рядом с каждым файлом

git diff --name-status START_COMMIT..END_COMMIT

простейшей форме:

git show --stat (hash)

это легче запомнить, и это даст вам всю необходимую информацию.

Если вы действительно хотите только имена файлов, вы могли бы добавить .

git show --stat --name-only (hash)


Я использую изменить псевдоним a довольно часто. Чтобы настроить его:

git config --global alias.changed 'show --pretty="format:" --name-only'

затем:

git changed (lists files modified in last commit)   
git changed bAda55 (lists files modified in this commit)
git changed bAda55..ff0021 (lists files modified between those commits)

похожие команды, которые могут быть полезны:

git log --name-status --oneline (very similar, but shows what actually happened M/C/D)
git show --name-only

используя стандартную команду git diff (также хорошо для сценариев):

git diff --name-only <sha>^ <sha>

Если вы хотите также статус измененные файлы:

git diff --name-status <sha>^ <sha>

это хорошо работает с слияния коммитов.


$ git log 88ee8^..88ee8 --name-only --pretty="format:"

использовать

git log --name-status

Это покажет вам идентификатор фиксации, сообщение, измененные файлы и был ли он изменен, создан, добавлен или удален. Что-то вроде команды "все-в-одном".


ОК есть несколько способов, чтобы показать все файлы в определенной фиксации...

для уменьшения информации и показать только имена из файлов, которые совершили, вы просто можете добавить --name-only или --name-status флаг..., эти флаги просто показывают вам имена файлов, которые отличаются от предыдущих коммитов, как вы хотите...

так что вы можете сделать git diff следовал по --name-only, с двумя хэшами фиксации после <sha0> <sha1>, что-то вроде ниже:

git diff --name-only 5f12f15 kag9f02 

Я также создаю изображение ниже, чтобы показать все шаги, чтобы пройти в этой ситуации:

git diff --name-only 5f12f15 kag9f02


Я использую это, чтобы получить список измененных файлов между двумя наборами изменений:

git diff --name-status <SHA1> <SHA2> | cut -f2

Мне нравится использовать

git show --stat <SHA1>^..<SHA2>

git show --name-only commitCodeHere

Мне нравится это:

git diff --name-status <SHA1> <SHA1>^

там же git whatchanged, что является более низким уровнем, чем git log

NAME
       git-whatchanged - Show logs with difference each commit introduces

он выводит сводку фиксации со списком файлов под ней с их режимами, и если там добавлено (A), удалить(D) или изменен(M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

дали бы что-то вроде:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <xx@xx.nl>
Date:   Tue Sep 29 17:23:22 2015 +0200

    added fb skd and XLForm

:000000 100644 0000000... 90a20d7... A  Pods/Bolts/Bolts/Common/BFCancellationToken.h
:000000 100644 0000000... b5006d0... A  Pods/Bolts/Bolts/Common/BFCancellationToken.m
:000000 100644 0000000... 3e7b711... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h
:000000 100644 0000000... 9c8a7ae... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m
:000000 100644 0000000... bd6e7a1... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h
:000000 100644 0000000... 947f725... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m
:000000 100644 0000000... cf7dcdf... A  Pods/Bolts/Bolts/Common/BFDefines.h
:000000 100644 0000000... 02af9ba... A  Pods/Bolts/Bolts/Common/BFExecutor.h
:000000 100644 0000000... 292e27c... A  Pods/Bolts/Bolts/Common/BFExecutor.m
:000000 100644 0000000... 827071d... A  Pods/Bolts/Bolts/Common/BFTask.h
...

Я знаю, что этот ответ не соответствует действительности "без посторонней информации.", но я все еще думаю, что этот список более полезен, чем просто имена файлов.


используйте простую команду one line, если вы просто хотите, чтобы список файлов изменился в последнем коммите:

git diff HEAD~1 --name-only

список файлов, которые изменились в коммит:

git diff --name-only SHA1^ SHA1

Это не показывает сообщения журнала, дополнительные новые строки или любой другой беспорядок. Это работает для любой фиксации, а не только для текущей. Не уверен, почему это не совсем нет, поэтому я добавляю его.


показать журнал.

фиксация может быть пустой ( "" ) или SHA-1 или SHA-1 сокращенной.

git log COMMIT -1 --name-only

здесь будут перечислены только файлы, очень полезные для дальнейшей обработки.

git log COMMIT -1 --name-only --pretty=format:"" | grep "[^\s]"

нашел идеальный ответ на это:

git show --name-status --oneline <commit-hash>

чтобы я мог знать

which files were just modified M

Which files were newly added , A

Which files were deleted , D

сочетание "git show --stat " (спасибо Райан) и несколько команд sed должны обрезать данные для вас:

git show --stat <SHA1> | sed -n "/ [\w]\*|/p" | sed "s/|.\*$//"

это приведет только к списку измененных файлов.


существует простой трюк для просмотра в виде списка файлов, просто добавьте : после хэш.

git show 9d3a52c474:

затем вы можете сверлить,

git show 9d3a52c474:someDir/someOtherDir

если вы нажмете файл, вы получите сырую версию файла; что иногда является тем, что вы хотите, если вы ищете только хорошую ссылку или ключевые фрагменты кода (различия могут сделать все беспорядок),

git show 9d3a52c474:someDir/someOtherDir/somefile

единственным недостатком этого метода является то, что он легко не показать дерево файлов.


git show HEAD@{0}

отлично работает для меня


Я думал, что поделюсь резюме моего псевдонима.. также я нахожу использование " zsh " отличным с Git it chroma keys все красиво и говорит, что вы хотите, чтобы ветка была все время, изменяя командную строку.

для тех, кто покрывает из SVN, вы найдете это полезным: (это комбинация идей из разных потоков, я только беру кредит, зная, как использовать copy/paste)

.gitconfig:
        ls = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative --name-status

>>git ls
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker| 
| A     icds.xcodeproj/project.pbxproj
| A     icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata
| A     icds/AppDelegate.m
| A     icds/Assets.xcassets/AppIcon.appiconset/Contents.json

* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker| 
| D     Classes/AppInfoViewControler.h
| D     Classes/AppInfoViewControler.m
| D     Classes/CurveInstrument.h


.gitconfig: 
       lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>>git lt
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker
* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker
* 778bda6 - Cleanup for new project (11 hours ago) Jim Zucker
* 7373b5e - clean up files from old version (11 hours ago) Jim Zucker
* 14a8d53 - (tag: 1.x, origin/swift, origin/master, master) Initial Commit (16 hours ago) Jim Zucker


.gitconfig
lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>> git lt

commit 99f21a61de832bad7b2bdb74066a08cac3d0bf3c
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:23:10 2015 -0800

    New Files from xcode 7

A       icds.xcodeproj/project.pbxproj
A       icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata


commit e0a1bb6b59ed6a4f9147e894d7f7fe00283fce8d
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:17:00 2015 -0800

    Move everything to old

D       Classes/AppInfoViewControler.h
D       Classes/AppInfoViewControler.m
D       Classes/CurveInstrument.h
D       Classes/CurveInstrument.m

Это должно работать:

git status

Это покажет, что не поставлено и что поставлено.