Як перелічити всі файли в коміті?


2791

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

Я намагався:

git show a303aa90779efdd2f6b9d90693e2cbbbe4613c1d

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

Чи є інша gitкоманда, яка надасть лише потрібний мені список, щоб я міг уникнути їх аналізу з git showвиводу?


43
Я прийшов сюди шукати щось трохи інше. Я хочу побачити всі файли, модифіковані для набору комітетів і завершені git log --until 2013-05-21 --pretty="short" --name-onlyз використанням хорошого ефекту.
Обмежене спокутування

4
Використовуйте цю команду , щоб отримати всі зміни з попередніх nфіксацій до master:git diff-tree --name-status -r @{3} master
АКО

3
git diff --name-only master- Список усіх змінених файлів на поточній гілці порівняно з головною гілкою.
Ноам Манос

Відповіді:


3758

Бажаний шлях (тому що це команда сантехніка ; мала бути програмною):

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

Інший спосіб (менш кращий для сценаріїв, тому що це команда з порцеляни ; мала на увазі користувача)

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

  • В --no-commit-idпригнічує фіксації вихідного ідентифікатора.
  • --prettyАргумент задає порожній рядок формату , щоб уникнути мотлоху на самому початку.
  • У --name-onlyміркуванні показує тільки імена файлів , які були порушені (Спасибі Hank). Використовуйте --name-statusнатомість, якщо ви хочете побачити, що сталося з кожним файлом ( D вибрано, M відмінено, A dded)
  • -rАргумент для рекурсії в суб-дерева

25
Слід зазначити, що diff-treeне буде працювати при перегляді кореневих комірок.
jbranchaud

327
Заміна --name-onlyпараметра на --name-statusдасть більш чітке резюме.
Курт Чжун

20
Якщо ви хочете, щоб він працював на кореневій фіксації, використовуйте прапор --root. На сторінці man: "Коли буде вказано --root, початкова комісія буде показана як велика подія створення. Це еквівалентно диференцію проти дерева NULL."
Кріс

24
git log --name-only -n 1 <hash>Останнім зобов’язанням було б:git log --name-only -n 1 HEAD~1..HEAD
Курт

10
Якщо хтось задається питанням (як я), чому перший спосіб "кращий", він повертається до коментаря @drizzt; git show"порцеляна" (призначена для користувача) та git diff-tree"сантехніка" (призначена для використання програмно, наприклад, із сценаріїв). Інтерфейс для першого може змінитися з часом (так що сервіси git можуть випадати, --name-onlyхоча я не думаю, що це було б ) з міркувань використання, тоді як інтерфейс для останнього буде підтримуватися максимально стабільним з міркувань сумісності.
killscreen

237

Якщо ви хочете отримати список змінених файлів:

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

Якщо ви хочете отримати список усіх файлів у комісі, ви можете використовувати

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

1
Дерево ls з --name-only, здається, не працює на 1.6.4.4 або 1.6.3.3. Ви вважаєте, це помилка?
krosenvold

git ls-tree --name-only HEAD( потрібен параметр <commit-ish> ; у цьому прикладі це HEAD) працює для мене з версією git 1.6.4.3
Jakub Narębski

2
Виявляється, впорядкованість параметрів тут істотна. Той, хто працює у вашому дописі, не працює, тоді як той, хто працює у вашій відповіді , працює - принаймні, поки ви не оновите свою пошту;)
krosenvold

5
Пройдіть, --no-commit-idщоб уникнути друку SHA1, наприклад:git diff-tree --no-commit-id --name-only -r <commit-ish>
Джон Меллор

3
@CoDEmanX: Ви не пропустили додавання -r/ -tпараметр, чи не так? Тому що diff-дерево обробляє як модифіковані, так і додані файли. Якщо ви хочете перерахувати всі нові (додані) файли, використовуйтеgit diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish>
Jakub Narębski

226

Я просто припускаю, що gitkцього не бажано. У такому випадку спробуйте git show --name-only <sha>.


36
- тільки імені є в більшості випадків, коли мені це було потрібно; Тому виступили з найкоротшим рішенням (і єдиним, яке я запам'ятав би за 1 спробу).
Erik S

25
Або --name-status.
Ніл Трафт

Оскільки хтось дійсно любить CLI git, gitkнасправді є гідним способом перегляду файлів та відображення файлу, на якому розміщено розл. наприклад, Код, що переглядає вчинок монстра від однолітка.
Ілля Лінн

192

Я особисто використовую комбінацію --stat і --oneline з командою show :

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

Якщо вам не подобається / хочете статистика додавання / видалення, ви можете замінити --stat лише на --name

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

4
Це чудово! Це в основному дає вам підсумок файлів, який Github показує у верхній частині подання комітів. Дякую.
trisweb

Дуже хороший. Щоб визначити псевдонім:, alias gits='git show --stat --oneline'він gitsсам по собі показує останні зміни (в HEAD), тоді як gits b24f5fbможе бути використаний для показу будь-яких змін редакції.
Brent Faust

5
Можна також створити псевдонім git ... наприклад, можливо git config --global alias.changes 'show --stat --oneline'. Тоді ви можете набрати git changes(з необов’язком фіксацією) і отримати результат з перших вище прикладів.
lindes

Git для Windows вимагає подвійних пропозицій:git config --global alias.changes "show --stat --oneline"
Alchemistmatt

3
Приємно. І на відміну від прийнятої відповіді, git showтакож працює для перегляду прихованих змін: напр.git show --stat --oneline stash@{1}
Джефф Уорд

83

Ви також можете зробити

git log --name-only

і ви можете переглядати різні коміти, вводити повідомлення та змінені файли.

Введіть q, щоб повернути своє запит.


Дякую, це допомагає. BTW: використовуйте git show 5944ad2a8b5 --name-onlyдля переліку імені конкретного
комітету

68

Нещодавно мені потрібно було перерахувати всі змінені файли між двома комітами. Тому я використав цю команду (також * nix specific)

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

4
Якщо ви користуєтеся, git diff --name-status START_COMMIT..END_COMMITто вам не потрібен трейлінг |sort | uniq.
Етан

Виправлення вище коментаря:git diff --name-only START_COMMIT..END_COMMIT
Етан

Це те, що я шукав. Як я використовував це: git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Я хотів, щоб список змін коду був лише для величезного PR, який додав тисячі макетів PNG та XML.
AutonomousApps

63

Найпростіша форма:

git show --stat (hash)

Це простіше запам’ятати, і це дасть вам всю необхідну інформацію.

Якщо ви дійсно хочете лише імен файлів, ви можете додати цю --name-onlyопцію.

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


2
- тільки ім’я все ще буде включати пару рядків заголовка, що містять інформацію, таку як автор, дата та повідомлення про фіксацію.
пожирав елізіум

тільки один я виявив, що працює на
комісію

47

Я часто користуюся зміненим псевдонімом. Щоб налаштувати його:

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

40

Використовуйте

git log --name-status

Це покаже вам ідентифікатор фіксації, повідомлення, змінили файли та змінили їх, створили, додали чи видалили. Дещо команда «все в одному».


38

Використання стандартної команди git diff (також добре для сценаріїв):

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

Якщо ви також бажаєте статусу змінених файлів:

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

Це добре працює з об'єднаннями комітетів.


26

спробуйте цю команду для імені та зміни номера рядка

git show --stat <commit-hash>

показувати лише імена файлів

git show --stat --name-only  <commit-hash>

для отримання останнього хеша фіксації, тоді спробуйте цю команду

git log -1

остання фіксація із показом файлів, ім'я та статус файлів змінюють, створюють або видаляють

 git log -1 --oneline --name-status <commit-hash>

або для всіх

git log

для отримання більш досконалої інформації про журнал git читайте цю статтю

https://devhints.io/git-log-format

https://devhints.io/git-log


1
@DanFare "фатальний: нерозпізнаний аргумент: --names-only" від 2.20.1.Windows.1
user2864740


20

Гаразд, є кілька способів показати всі файли в певному комісі ...

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

Таким чином, ви можете виконати, git diffпісля чого --name-only, два набрання хеша <sha0> <sha1>, щось подібне нижче:

git diff --name-only 5f12f15 kag9f02 

Я також створюю зображення нижче, щоб показати всі кроки, які потрібно пройти в цій ситуації:

git diff - тільки ім'я 5f12f15 kag9f02


Чому два реф (ви їх називаєте хешами)?
хакре

15

Я використовую це для отримання списку модифікованих файлів між двома наборами змін:

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

Так, але стан може бути дуже зручним (для isntance, ви можете захопити відобразити всі файли, крім тих, які були видалені з чимось на зразокgit diff --name-status .. | grep ^[^D] | cut -f2
Pierre-Adrien Buisson,


14

Там також 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
...

Я знаю, що ця відповідь насправді не відповідає "без сторонньої інформації". Але я все-таки вважаю, що цей список корисніший, ніж просто імена файлів.


Плюс лише одна команда whatchangedзамість подачі параметрів.
Габрієлій

11

Мені це подобається:

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

Я думаю, що це отримує статуси файлів A& D(додавання та видалення) назад, тому що він показує відмінність від зазначеної фіксації до попередньої комісії, а не навпаки. Це повинно бути git diff --name-status <SHA1>^ <SHA1>.
Troy Gizzi

11

Використовуйте просту команду з одним рядком, якщо ви просто хочете, щоб список файлів змінився в останньому комітеті:

git diff HEAD~1 --name-only

8

Перерахуйте файли, які були змінені в коміті:

git diff --name-only SHA1^ SHA1

Це не відображає повідомлення журналу, зайві нові рядки чи будь-які інші захаращення. Це працює для будь-якого комітету, а не лише поточного. Не впевнений, чому це ще не зовсім згадано, тому я додаю його.


Це два виглядає так само: git diff SHA1^ SHA1і git show SHA1.
Володимир Вуканак

1
@mrW Ці команди дають подібний вихід, але git showтакож відображається повідомлення про фіксацію
Newtonx

8

Відобразити журнал.

COMMIT може бути порожнім ("") або sha-1 або sha-1 скороченим.

git log COMMIT -1 --name-only

Тут буде вказано лише ті файли, дуже корисні для подальшої обробки.

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

8

Знайшов ідеальну відповідь на це:

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

Так що я можу знати

which files were just modified M

Which files were newly added , A

Which files were deleted , D

5

Комбінація " git show --stat" (спасибі Ryan) і кілька команд sed повинні обрізати дані для вас:

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

Це створить лише список модифікованих файлів.


5

Існує простий трюк, який можна переглянути як список файлів, просто додайте :після хешу.

git show 9d3a52c474:

Потім ви можете свердлити,

git show 9d3a52c474:someDir/someOtherDir

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

git show 9d3a52c474:someDir/someOtherDir/somefile

Єдиним недоліком цього методу є те, що він не може легко показати дерево файлів.



2

Я використовую це для отримання списку змінених файлів у об'єднанні

λ git log -m -1 --name-only --pretty="format:"
configs/anotherconfig.xml
configs/configsInRepo.xml

або

λ git log -m -1 --name-status --pretty="format:"
A       configs/anotherconfig.xml
M       configs/configsInRepo.xml

2

Якщо ви використовуєте плагін oh-my-zsh та git, ярлик glg буде корисним.


3
Ви щойно ... відрізали весь код зі своєї відповіді? Це зовсім не те, на що я посилався. Ніякої сторонньої інформації в результаті виведення, як вимагає ОП, не у вашій відповіді! Ви все ще маєте відповідь, що виводить багато чужої інформації. Але зараз це просто описано набагато менш точно. ОП хотіла витіснити список файлів, і більше нічого. Подивіться, які glgрезультати: набагато більше. Вибачте за непорозуміння.
RomainValeri

0

Лише список файлів (навіть не ввести повідомлення):

git show --name-only --pretty=format:

Наприклад, відкрийте всі змінені файли у вашому редакторі:

"$EDITOR" $(git show --name-only --pretty=format:)

-2

Я думав, що поділюсь підсумком свого псевдоніма .. також я знаходжу, що використовую 'zsh' чудово з git it chroma клавішами все добре і каже, що ти хочеш, щоб гілка була постійно, змінюючи командний рядок.

Для тих, хто охоплює SVN, ви знайдете це корисним: (це поєднання ідей з різних потоків, я беру до уваги лише те, як використовувати копіювати / вставляти)

.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

-3

Це має працювати:

git status

Це покаже, що не інсценоване, а що інсценізоване.


7
Питання полягає в тому, щоб отримати список файлів у раніше здійсненому фіксації, хоча, а не в тому, що потрібно зробити.
Rup
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.