Как я могу перечислить все удаленные файлы в репозитории Git?

306

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

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

Ответы:

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

См. Поиск и восстановление удаленного файла в репозитории Git.

Если вы не хотите, чтобы вся информация о коммите была удалена, вы можете просто добавить grep deleteтуда.

git log --diff-filter=D --summary | grep delete
I82Much
источник
13
Предупреждение: в этом списке перечислены все файлы, которые вы удалили. Если вы удалили файл, а затем создали новый файл с тем же именем, он появится в этом списке, даже если там есть существующий файл.
TJ Crowder
24
Вы также должны посмотреть на команду git whatchanged . Это довольно круто.
Мистер Черный
6
Это будет также перечислять переименования как удаляет. Чтобы пропустить это использованиеgit log --find-renames --diff-filter=D --summary | grep delete
Slaven Rezic
2
В git 2.9 обнаружение переименований включено по умолчанию. Чтобы увидеть их снова как удаляет используйтеgit log --no-renames --diff-filter=D --summary | grep delete
Michael Große
2
Остерегайтесь использования, grep deleteпотому что если в сообщении о фиксации есть слово delete, оно также будет поднято. Используйте grep 'delete mode'вместо этого.
Вадим
85

Это делает то, что вы хотите, я думаю:

git log --all --pretty=format: --name-only --diff-filter=D | sort -u

... который я более или менее прямо взял из этого другого ответа .

Марк Лонгэйр
источник
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) вместе с номером коммита, в котором это произошло. Подойдет любое регулярное выражение sed (я использую это для поиска удаленных типов файлов и т. Д.)

estani
источник
2
Я считаю, что это слишком сложно, чтобы быть полезным в повседневной жизни разработчиков. Вместо этого, если вы хотите просмотреть список файлов, удаленных из текущей директории, просто сделайте:git log --diff-filter=D .
Себи
Случай, который у меня был, был то, что каталог также был удален, и я просто новая часть имени.
Эстани
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/…
Джеймс Скемп
В Windows есть FIND и FINDSTR , хотя я должен признать, что никогда не использовал их. Установка Git Bash - самый простой способ. Альтернативой является раздутый Cygwin .
Питер Мортенсен
4

Показать все удаленные файлы в some_branch

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

или

git diff origin/master...origin/some_branch --name-status --diff-filter=D 
vix2
источник
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.

Mr_and_Mrs_D
источник