Что касается конечного результата, они сделают то же. Различие находится в как dd
обработал бы данные. И на самом деле, обоими Вашими примерами является вполне экстремальное значение в том отношении: bs
параметр говорит dd
сколько данных это должно буферизовать в память прежде, чем произвести его.
Так, по существу первая команда попыталась бы считать 2 ГБ в двух блоках 1 ГБ, и последний попытается считать целых 2 ГБ в, каждый идет и затем произвел ее к aa
файл.
Наивное решение:
git rev-list --all | xargs -n1 git ls-tree --full-name -r --name-only | sort -u
Это перечисляет все фиксации, затем использует это для списка всех файлов в каждой фиксации. вид дедуплицирует. Только работы для небольшого repos, хотя, как требуется много времени.
Лучшее решение состояло бы в том, чтобы использовать libgit2, чтобы сделать то же, должно быть быстрее, но требует некоторого программирования. Быстрый взлом, который реализует это, может быть найден на GitHub. Это использует pygit2 и является порядком величины быстрее, чем конвейер оболочки выше.