Как вывести список изменений в дереве каталогов в git - PullRequest
15 голосов
/ 17 августа 2011

Git не отслеживает каталоги как таковые.Он только отслеживает файлы, которые живут в некотором каталоге.(См. Как добавить пустой каталог в репозиторий Git? )

Однако, если у меня есть определенная история коммитов, у меня неявно также есть история изменений в дереве каталогов.

Итак, как мне ответить на такие вопросы, как:

  1. когда был создан каталог foo / bar (в терминологии git: когда был создан первый файл в этом каталоге).Может быть несколько квалификационных коммитов, если foo / bar был удален некоторое время в истории и воссоздан позже.
  2. когда был удален каталог foo / bar (в терминологии git: когда был удален последний файл из этого каталога).Как и выше, может быть несколько квалификационных коммитов.
  3. Какие подкаталоги foo / bar существовали в любой момент времени в истории

Ближайший, который я мог придуматьв псевдокоде:

loop over all commits (git rev-list --all)
  start from repo root directory
  do recursively on the directory tree rebuilt so far
    call git ls-tree and grep the tree lines
    rebuild next level of directory tree
  end
end

Очевидно, что это может быть написано на вашем любимом языке сценариев.

Тогда у меня есть все деревья каталогов, и мне все еще нужно искать их разумно, чтобы ответить на вопросы типа 1 - 3. Опять же, выполнимо, но, вероятно, не через пару минут.

Вопросы:

  1. Есть ли более простой способ?
  2. Если нет: подходят ли сценарии уже в сети?(мой поисковый запрос не выявил ничего, но я также не нашел подходящих поисковых слов)

Ответы [ 2 ]

10 голосов
/ 17 августа 2011

Для вопросов 1 и 2 это довольно просто:

  • когда был создан каталог foo / bar?
    git log --oneline -- foo/bar | tail -n 1

  • когда был удален каталог foo / bar?
    git log --oneline -- foo/bar | head -n 1

Однако третья часть немного сложная, и я не могу ответить на нее полностью.

две приведенные выше команды дают вам $FIRST_REV (создано) и $LAST_REV (удалено).

Следующий фрагмент дает вам все коммиты, где дерево было изменено:

for rev in $(git rev-list FIRST_REV..LAST_REV)
do
  git ls-tree -r -t $rev | grep tree | cut -f 2
done

Затем выесть список каталогов, которые присутствовали.Но есть еще дубликаты.Передайте этот список sort -u, и все готово:

#!/bin/sh
for r in $(git rev-list FIRST_REV..LAST_REV) 
do 
    git ls-tree -r -t $r | grep tree | cut -f 2
done | sort -u

Однако вы потеряете информацию о коммитах, где были затронуты эти каталоги.Это недостаток.

И это предполагает, что foo/bar был создан только один раз и больше не присутствует.

4 голосов
/ 27 ноября 2013

gitk foo/bar предоставляет вам пользовательский интерфейс для просмотра истории git, ограниченный коммитами, которые коснулись foo/bar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...