Поиск коммитов подмодулей, которые никогда не помещались в публичный репозиторий - PullRequest
2 голосов
/ 26 января 2012

Может ли кто-нибудь помочь мне заполнить недостающие фрагменты сценария, который я пытаюсь написать? Я только что понял, что у меня есть публичный репозиторий, который содержит ссылки на коммиты в подмодуле, который я никогда не выдвигал к источнику (коммиты были реорганизованы перед нажатием). Я не знаю, сколько раз это происходило, но я хотел бы выяснить и создать временные ветки, чтобы подтолкнуть их к источнику.

Итак, вернемся к сценарию. Я знаю, что могу получить список коммитов с изменениями в моем подмодуле, которые я могу отфильтровать с помощью grep и использовать cut, чтобы получить фактические теги SHA1 из my_submodule:

git log -u origin/master -- my_submodule \
    | grep "^\+Subproject" \
    | cut -d" " -f 3

На тот момент у меня было 20 тегов, и я просто использовал текстовый редактор, чтобы создать скрипт для ручной маркировки каждого тегом «tag_00xx». Затем я вручную просмотрел репозиторий в Git Extensions и удалил все теги для коммитов, которые превратили его в origin / master, оставив один тег, который никогда не выдвигался.

Что я должен был сделать, чтобы создавать теги только для коммитов, которые не были в origin / master? Я знаю, что я могу сделать:

git branch -r --contains <commit_sha1>

Но это не устанавливает код выхода, который я могу использовать для выборочного создания новых тегов. Как я мог завершить автоматизацию моей задачи?

1 Ответ

1 голос
/ 27 января 2012

Я бы, вероятно, сделал это следующим образом - во-первых, вы можете получить список всех зафиксированных версий субмодуля без grep и cut, выполнив:

git rev-list origin/master | while read COMMIT
do
    SUBMODULE_COMMIT=$(git rev-parse $COMMIT:my_submodule 2> /dev/null)
    if [ $? = 0 ]
    then
        echo $SUBMODULE_COMMIT
    fi
done | sort | uniq > committed-submodule-versions

Затем для каждого из них вам нужно перейти в подмодуль и проверить, находится ли он в origin/master. Вероятно, самый простой способ сделать это - получить выходные данные git branch -r --contains <SUBMODULE-COMMIT>, с тех пор вы можете использовать код выхода grep.

Например:

cd my_submodule
while read S
do
    if git rev-parse --verify $S > /dev/null 2> /dev/null
    then
        git branch -r --contains $S 2> /dev/null \
            | grep origin/master > /dev/null \
            || git branch missing-${S:0:8} $S
    else
        echo $S not found in the repository at all
    fi

done < ../committed-submodule-versions

Еще один момент, на который следует обратить внимание: я создаю ответвлений для нефиксированных коммитов, а не тегов. Причина этого в том, что git submodule update вызывает git fetch, но не git fetch --tags, что означает, что теги, которые не указывают на известные коммиты, не будут выбраны (!).

...