¿Cuál es la forma correcta de determinar el estado de una sucursal de Git mediante progtwigción?

He leído varias otras publicaciones de SO y resultados de búsqueda de Google que git status --porcelain no es realmente el command en el que desea confiar si está parsing programáticamente el estado actual de la twig de git. Eventualmente me señalaron los commands rev-parse , diff-index , y diff-files para hacer esto, sin embargo, el método que estoy usando actualmente es un poco problemático, particularmente en twigs que no sean maestras. Temas como Bureau for oh-my-zsh parecen estar usando el git status --porcelain , que anteriormente git status --porcelain no fue recomendado por la comunidad de Git. Entonces, ¿cuál es la forma correcta de leer en estados de twig como estos?

Segmento de código del tema de Bureau Oh-My-ZSH para que quede claro qué comportamiento estoy tratando de reproducir.

 bureau_git_status () { _INDEX=$(command git status --porcelain -b 2> /dev/null) _STATUS="" if $(echo "$_INDEX" | grep '^[AMRD]. ' &> /dev/null); then _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_STAGED" fi if $(echo "$_INDEX" | grep '^.[MTD] ' &> /dev/null); then _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNSTAGED" fi if $(echo "$_INDEX" | command grep -E '^\?\? ' &> /dev/null); then _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNTRACKED" fi if $(echo "$_INDEX" | grep '^UU ' &> /dev/null); then _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_UNMERGED" fi if $(command git rev-parse --verify refs/stash >/dev/null 2>&1); then _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_STASHED" fi if $(echo "$_INDEX" | grep '^## .*ahead' &> /dev/null); then _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_AHEAD" fi if $(echo "$_INDEX" | grep '^## .*behind' &> /dev/null); then _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_BEHIND" fi if $(echo "$_INDEX" | grep '^## .*diverged' &> /dev/null); then _STATUS="$_STATUS$ZSH_THEME_GIT_PROMPT_DIVERGED" fi echo $_STATUS } 

Eventualmente voy a apoyar todo el comportamiento anterior, aquí está mi inicio en eso y los commands básicos que estoy usando actualmente para hacer cosas (disculpen el hecho de que sea Haskell, con suerte eso no impide que nadie obtenga el esencia de lo que está haciendo el código, sin juego de palabras).

 hasCommitsToPush :: IO (Maybe Bool) hasCommitsToPush = do latestCommits <- liftM (fmap $ deleteNulls . splitOnNewLine) $ parseProcessResponse gitRemoteRefDiff case latestCommits of Nothing -> return Nothing Just [] -> return $ Just False Just [_] -> return $ Just True -- This case is for a new repository with the first commit in local but not yet pushed. Just [latestRemoteCommit, latestLocalCommit] -> return . Just $ latestRemoteCommit /= latestLocalCommit _ -> return Nothing where gitRemoteRefDiff = readProcessWithExitCode "git" ["rev-parse", "@{u}", "HEAD"] [] hasStagedChanges :: IO (Maybe Bool) hasStagedChanges = liftM (fmap isResponseNull) $ parseProcessResponse gitResponse where gitResponse = readProcessWithExitCode "git" ["diff-index","--cached","--ignore-submodules","HEAD"] [] hasUnstagedChanges :: IO (Maybe Bool) hasUnstagedChanges = liftM (fmap isResponseNull) $ parseProcessResponse gitStatus where gitStatus = readProcessWithExitCode "git" ["diff-files","--ignore-submodules"] [] 

Editar AndrewC señaló que –porcelana se describe en los documentos como un propósito para el análisis por scripts. Esto me hace preguntar, ¿cuándo debería usar rev-parse vs. --porcelain ?

Solo para que haya una respuesta oficial:

Como en los comentarios, los doctores DICEN que el indicador de porcelana con estado de Git está ahí para proporcionar el análisis de los guiones. Mi fuente de confusión es que, en general, este no es el papel de la bandera de porcelana, y tradicionalmente, un command de "plomería" normalmente se especificaría para tal fin en Git. Por lo tanto, en este caso, el uso del indicador –porcelain parece ser una forma aceptada de analizar el estado de los repositorys Git, pero esta es una exception a lo que normalmente significa porcentain.

Más detalles están cubiertos en las siguientes publicaciones de SO que descubrí mientras buscaba explicaciones mejores. ¿Qué hace git rev-parse hacer? ¿Qué significa el término "porcelana" en Git?