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


304

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


Для тих , хто наштовхнутися на цей відповідь , але просто хочете побачити список файлів , доданих, перейменовані, видаляти, змінювати і т.д., з одного фіксації хеш або гілки на іншу, зробіть наступне: git diff --name-status commit_hash.
Габріель Степлес

Відповіді:


409
git log --diff-filter=D --summary

Див. Розділ Знайти та відновити видалений файл у сховищі Git

Якщо ви не хочете, щоб уся інформація про те, в якій комісії вони були видалені, ви можете просто додати grep deleteтам.

git log --diff-filter=D --summary | grep delete

13
Попередження: у цьому списку перелічені всі файли, які ви видалили. Якщо ви видалили файл, то створюється новий файл з таким же ім'ям, він буде відображатися в списку, навіть якщо є більш збережений файл там.
TJ Crowder

24
Ви також повинні переглянути команду git whatchanged . Це досить круто.
Містер Блак

6
У цьому списку також буде вказано перейменування як видалення. Щоб пропустити ці діїgit log --find-renames --diff-filter=D --summary | grep delete
Славен Резіч

2
За допомогою git 2.9 виявлення перейменувань активовано за замовчуванням. Щоб побачити їх знову як делетів, використовуйтеgit log --no-renames --diff-filter=D --summary | grep delete
Michael Große

2
Обережно використовуйте, grep deleteтому що якщо у повідомленні про завершення є слово delete, воно також буде вибране. Використовуйте grep 'delete mode'замість цього.
Вадим


37

Якщо вас цікавить лише перегляд видалених на даний момент файлів, ви можете скористатися цим:

git ls-files --deleted

якщо ви хочете їх видалити (якщо ви видалили їх, не використовуючи "git rm") трубу, що призводить до xargs git rm

git ls-files --deleted | xargs git rm

11
Це показує лише файли в індексі, які були видалені з робочої копії. ОП хоче, щоб всі файли, які коли-небудь були видалені.
Макс Нанасі

1
абоgit rm $(git ls-files --deleted)
юнзен

незважаючи на те, що це не те, чого хотіла ОП, це все одно було корисно щонайменше для мене, оскільки у мене виникли проблеми правильно
solstice333

10

Посилаючись на цю відповідь на переповнення стека.

Це досить акуратний спосіб отримати тип змін (A: Додано, M: Змінено, D: Видалено) для кожного зміненого файлу.

git diff --name-status

4

І якщо ви хочете якось обмежити результати, ось приємний:

$ git log --diff-filter=D --summary | sed -n '/^commit/h;/\/some_dir\//{G;s/\ncommit \(.*\)/ \1/gp}'
delete mode 100644 blah/some_dir/file1 d3bfbbeba5b5c1da73c432cb3fb61990bdcf6f64
delete mode 100644 blah/some_dir/file2 d3bfbbeba5b5c1da73c432cb3fb61990bdcf6f64
delete mode 100644 blah/some_dir/file3 9c89b91d8df7c95c6043184154c476623414fcb7

Ви видалите всі файли some_dir(див. Команду sed) разом із номером фіксації, у якому це відбувається. Буде зроблено будь-який sedgegege (я використовую це для пошуку видалених типів файлів тощо)


2
Я вважаю, що це складний спосіб бути корисним у повсякденному житті розробника. Натомість, якщо ви хочете перерахувати файли, видалені з поточного каталогу, просто виконайте:git log --diff-filter=D .
Sebi

У мене був випадок, що каталог також було видалено, і я лише нову частину імені.
Естані

4

Оскільки у Windows немає grepкоманди, для PowerShell це працювало для мене:

git log --find-renames --diff-filter=D --summary | Select-String -Pattern "delete mode" | sort -u > deletions.txt

Що таке Select-String?
MarcusJ

1
Це командлет PowerShell. Дивіться docs.microsoft.com/en-us/powershell/module/…
James Skemp

Вікна є FIND і Findstr , хоча я повинен визнати , що я ніколи не використовував їх. Установка Git Bash - найпростіший спосіб. Альтернативою є роздутий Cygwin .
Пітер Мортенсен

4

Показати всі видалені файли в деякому_брані

git diff origin/master...origin/some_branch --name-status | grep ^D

або

git diff origin/master...origin/some_branch --name-status --diff-filter=D 

2
Це не працюватиме, оскільки міститиме всі файли, у яких є D. Вам потрібно щось на кшталт git diff origin/master...origin/some_branch --name-status | grep ^Dабоgit diff origin/master...origin/some_branch --name-status --diff-filter=D
nathaneastwood

1

Ви отримаєте список усіх файлів, які були видалені з усіх гілок, відсортованих за їхнім шляхом:

git log --diff-filter=D --summary | grep "delete mode 100" | cut -c 21- | sort > deleted.txt

Працює в msysgit (2.6.1.Windows.1). Зауважте, що нам потрібен "режим видалення 100", оскільки файли git можуть бути використані як режим 100644 або 100755.

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