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


178

Через бюрократію мені потрібно отримати список всіх змінених файлів у моєму сховищі для звіту (я почав із наявного вихідного коду).

Що мені потрібно запустити, щоб отримати цей список?


34
"через бюрократію" xD
ptim

Відповіді:


238

Для файлів, змінених між заданою SHA та поточною комісією:

git diff --name-only <starting SHA> HEAD

або якщо ви хочете включити змінити, але ще не здійснені файли:

git diff --name-only <starting SHA>

Загалом, наступний синтаксис завжди повідомляє вам, які файли змінилися між двома комітами (вказані їх SHA або іншими іменами):

git diff --name-only <commit1> <commit2>

2
і якщо ви хочете знати, що файли, модифіковані для певної фіксації, виконайте:git diff --name-only <SHA> <SHA>^
thebugfinder

3
Використовувати --name-statusпрапор замість --name-only, зручно отримати список файлів та переглянути їх статус модифікації, наприклад Доданий чи Змінений.
Thane Plummer

@Amber повинен згадати примітки @Thane Plummer, які --name-statusпоказують, що з ними трапилось
Zoltán Süle

64

Щоб знайти імена всіх файлів, змінених з моменту останнього вчинення:

git diff --name-only

Або (для отримання додаткової інформації, включаючи незатребувані файли):

git status

48
  • Щоб перелічити всі нестандартні відслідковувані змінені файли:

    git diff --name-only
    
  • Щоб перелічити всі поетапні відстежені зміни файлів:

    git diff --name-only --staged
    
  • Щоб перелічити всі поетапні та нестандартні відслідковувані змінені файли:

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • Щоб перелічити всі відслідковувані файли (ті, що перераховані git status, не включаючи ігноровані файли):

    git ls-files --other --exclude-standard
    

Якщо ви використовуєте це в сценарії оболонки, і ви хочете програмно перевірити , якщо ці команди повертаються нічого, ви будете зацікавлені в git diff«s --exit-codeваріанту.


16

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

Для цього я використовую:

  • Щоб перелічити всі нестадійні файли:

    git ls-files --other --modified --exclude-standard
    
  • Щоб отримати останню змінену дату для кожного файлу:

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

Хоча ruvim пропонує у коментарях :

xargs -0 stat -c '%y %n' -- 
  • Щоб сортувати їх від найдавніших до останніх:

    sort
    

Псевдонім полегшує використання:

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

Або (коротше та ефективніше, завдяки ruvim )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

Наприклад:

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

Зараз я можу переглянути свої зміни, від найдавніших до останніх.


Чому б не скористатись xargsі не подзвонити одночасно stat? Повна git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
однолінійка

@ruvim Дякую Дуже гарна пропозиція. Я відредагував відповідь, щоб включити ваш коментар, для більшої наочності.
VonC

4

Мені потрібен список файлів, які змінили вміст між двома комітами (лише додані чи змінені), тому я використав:

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

Різні варіанти диф-фільтра від документації на git diff :

diff-filter = [(A | C | D | M | R | T | U | X | B)… [*]]

Виберіть лише файли, додані (A), скопійовані (C), видалені (D), модифіковані (M), перейменовані (R), змінено їх тип (тобто звичайний файл, символьна посилання, підмодуль ...), змінені (T), є нерозподіленими (U), невідомими (X), або провели парне з'єднання (B). Можна використовувати будь-яку комбінацію символів фільтра (включаючи жодну). Коли * (All-or-none) додано до комбінації, всі шляхи вибираються, якщо в порівнянні є якийсь файл, який відповідає іншим критеріям; якщо немає файлу, який відповідає іншим критеріям, нічого не вибирається.

Крім того, ці великі літери можуть бути зменшені для зменшення. Напр. --Diff-filter = Оголошення виключає додані та видалені контури.

Якщо ви також хочете перерахувати статус (наприклад, A / M), перейдіть --name-onlyна --name-status.


3

Список нестандартних модифікованих можна отримати, використовуючи git statusтаку grepкоманду, як нижче. Щось таке git status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....

Зауважте, що це можна використовувати лише для нестандартних змін, тому корисно для "файлів, які змінювалися між двома Git-комітами"
Джон Ванденберг

2

З ним git showможна отримати аналогічний результат. Для перегляду фіксації (як це виглядає на git logперегляді) зі списком файлів, включених до цього, використовуйте:

git show --name-only [commit-id_A]^..[commit-id_B]

Де [commit-id_A]є початковий запис і чи [commit-id_B]є останній, якщо ви хочете показати.

Особлива увага з ^символом. Якщо цього не зробити, інформація commit-id_A не буде розгорнута.


1

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

статус git - він покаже файли зі змінами

то якщо ви хочете знати, які зміни потрібно внести, це можна перевірити способами,

git diff - покаже всі зміни у всіх файлах

добре лише тоді, коли буде змінено лише один файл

і якщо ви хочете перевірити конкретний файл, тоді використовуйте

git diff

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