Программный статус git

Кто-нибудь знает о сантехнике (определенно не фарфоре) git, чтобы определить, есть ли

  • есть изменения в репо с момента последнего коммита и
  • ли местная HEAD впереди начала /HEAD

Я хочу определить это программно, следовательно, желание не решить это с помощью фарфора и различных sed-fu.

Ответ 1

Обновление: как упомянутое ниже, toupeira, вы можете использовать опцию --porcelain git статус (с момента совершения 6f15787, сентябрь 2009 г., git 1.7.0).

Я упомянул в своем ответе "Что означает термин фарфор в Git?", который:

Возможно, смысл --porcelain здесь - "произвести вывод, подходящий для потребления фарфоровыми скриптами"

Однако это не покажет информацию о впереди/позади: см. "Что добавить в "git status --porcelain" , чтобы сделать он ведет себя как "git status" ?": для этого вам все равно нужно будет использовать другие команды: см. "Как узнать, есть ли репозиторий git которые не были синхронизированы с сервером?"


Первоначальный ответ Март 2009

В команде фарфора, a:

$ git diff HEAD

дает вам изменения со времени последнего коммита (что вы бы совершили, если вы запустили "git commit -a" ).

Возможный эквивалент команды сантехника:

$ git ls-files -m

для перечисления всех файлов измененного (рабочего каталога или индекса)


Если вы создадите свой репозиторий, клонировав чужой репозиторий, удаленная "главная" ветвь будет скопирована в локальную ветвь с именем "origin". Вы получаете свою собственную "ведущую" ветвь, которая не привязана к удаленному репозиторию.

Всегда есть текущая головка, известная как HEAD. (Это фактически символическая ссылка,.git/HEAD, в файл как refs/heads/master.)

запустите "git status" и проанализируйте вывод:

# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#

Подробнее в вопросе SO Почему git говорит мне: "Ваша ветка опережает" происхождение/мастер "на 11 коммитов" . И как мне ее остановить?? "

Возможный эквивалент команды сантехника:

* git-for-each-ref

для перечисления всех коммитов, но также требует анализа вывода...

Опять же, git ls файлы могут использоваться для получения того же результата, что и статус git.

git ls-files --exclude-per-directory=.gitignore --exclude-from=.git/info/exclude \
                    --others \
                    --modified \
                    -t

Ответ 2

git status теперь имеет аргумент --porcelain для сценариев (а также альтернативный -z для машинного разбора), это предпочтительнее git ls-files, который не показывает файлы, добавленные в индекс.