Как вы видите, вы должны определить, что вы подразумеваете под в син c.
Хранилище Git в первую очередь - это способ хранения коммитов. Набор коммитов в хранилище, найденный по именам веток и тегов и другим подобным именам, равен тому, что находится в хранилище. Коммиты - это история.
Большинство Git репозиториев, с которыми пользователи работают, однако не являются "голыми". У них есть рабочее дерево или рабочее дерево , в которое можно извлекать файлы из любого коммита и / или создавать дополнительные файлы и / или изменять различные файлы и так далее. Эта рабочая область может быть «чистой» (соответствует коммиту, более или менее) или «грязной».
Это «грязный» репозиторий, в котором выполняется много работы », в син c "с каким-либо другим хранилищем, даже если оба хранилища имеют одинаковый набор коммитов? Или это "не в синхронизации c"? Что если в другом хранилище есть рабочее дерево, и оно «грязное» точно так же? Это то, что вам нужно определить.
(Кроме рабочего дерева, все репозитории, даже голые, имеют также index , который также может быть «чистым» или «грязным» и, возможно, вам следует учитывать и это.)
В хранилище также может быть определен один или несколько пультов . С учетом удаленного имени, такого как origin
, Git можно сказать: подключиться к некоторому сетевому URL и получить новые коммиты от Git там, и поместить их в этот репозиторий. Вот что ваш git remote update
делает. Сколько пультов, с которыми они контактируют, может получить некоторые из них, или все из них, или, возможно, некоторые из них недоступны в настоящий момент, - трудно ответить, поскольку все это достаточно настраиваемо.
.. . [get] commit ha sh последнего коммита
Каждое имя ветки автоматически содержит идентификатор ha sh последнего коммита в этой ветке. Другими словами, может быть несколько «последних коммитов». Использование HEAD
- это правильный способ найти идентификатор ha sh для текущего коммита, но это может быть не коммитный коммит любой ветви:
rev=$(git rev-parse HEAD)
If HEAD
содержит имя неродившейся ветви 1043 *, этот шаг не будет выполнен. Это состояние имеет место в любом полностью пустом репозитории (потому что нет коммитов, следовательно, не может быть никаких имен веток; имена ветвей требуются для именования некоторых существующих коммитов). Однако это также состояние после операции git checkout --orphan
.
Я пишу сценарий bash, который проверяет группу проектов git и сообщает мне их состояния, т.е. неотслеживаемые файлы, незафиксированные файлы и не синхронизированные c с пультом.
Итак, вы можете выбрать, как определить каждую из этих вещей.
В общем, I будет:
- По желанию, каждый репозиторий должен связываться со своими основными вышестоящими потоками, какими бы они ни были: вероятно, определенными тем, что делает
git remote update
; рассмотрите здесь, хорошо это или плохо, разрешить --prune
(см. также настройку fetch.prune
). - Проверить по крайней мере текущую ветвь , как сообщает
git symbolic-ref HEAD
: если это команда завершается с ошибкой , текущая ветвь отсутствует, т. е. мы находимся на отсоединенной ГОЛОВЕ. - Проверьте состояние в соответствии с
git status --porcelain=v2
или аналогичным, чтобы посмотреть состояние индекс и дерево работ. Также рассмотрите возможность проверки статуса субмодуля; git status
может сделать это для вас или нет, в зависимости от настроек. - Используйте настройку текущей ветви upstream , если (a) есть текущая ветка и (b) она имеет вверх по течению. Этот восходящий параметр часто является именем ветви в другом репозитории Git. (Вместо этого это может быть имя ветви в этом хранилище.) Если это так, используйте
git rev-list --left-right --count branch...branch@{u}
для подсчета количества коммитов впереди и / или позади, возможно, после git remote update
с или без --prune
. - При желании проверьте каждое имя ветки, помня, что каждый Git репозиторий имеет свои собственные имена веток, и нет никакой особой причины, кроме удобства и соглашения, использовать то же самое имен в двух разных Git репозиториях. То есть, например,
dev
может не относиться к origin/dev
. Если мой dev
идет с origin/develop
, я, вероятно, установил восходящий поток dev
на origin/develop
, поэтому рассмотрите возможность проверки восходящего потока каждой ветви. Обратите внимание, что git branch -vv
делает это (а также считает значения вперед / назад, если не указано иное, а также имеет дополнительную поддержку добавленных рабочих деревьев).
За исключением текущей ветви и грязности ( о котором git status
уже сообщает), большая часть работы - просто git remote update -p
и git branch -vv
, действительно.