trucos tag que name log hace commits commands comentarios codigos git git-remote

git - tag - Listar todas las sucursales locales sin un control remoto



que es git log (7)

Aquí hay algo que he usado en PowerShell con comentarios para explicar lo que está haciendo. En un intento por dejar en claro lo que está sucediendo, no he usado ningún comando PS abreviado. No dude en comprimirlo a su nivel deseado de críptica :)

$verboseList = @(git br -vv) foreach ($line in $verboseList) { #get the branch name $branch = [regex]::Match($line, "/s(/S+)/s").Captures.Groups[1].Value #check if the line contains text to indicate if the remote is deleted $remoteGone = $line.Contains(": gone]") #check if the line does not contain text to indicate it is a tracking branch (i.e., it''s local) $isLocal = !($line.Contains("[origin/")) if ($remoteGone -or $isLocal) { #print the branch name $branch } }

Problema: quiero una forma de eliminar todas las sucursales locales que tengo que no tengan un control remoto. Es fácil git branch -D {branch_name} los nombres de las ramas en una git branch -D {branch_name} , pero ¿cómo obtengo esa lista en primer lugar?

Por ejemplo:

Creé una nueva rama sin control remoto:

$ git co -b no_upstream

Enumero todas mis ramas, solo hay 1 con un control remoto

$ git branch -a master * no_upstream remotes/origin/HEAD -> origin/master remotes/origin/master

¿Qué comando puedo ejecutar para obtener no_upstream como respuesta?

Puedo ejecutar git rev-parse --abbrev-ref --symbolic-full-name @{u} y eso mostrará que no tiene control remoto:

$ git rev-parse --abbrev-ref --symbolic-full-name @{u} error: No upstream configured for branch ''no_upstream'' error: No upstream configured for branch ''no_upstream'' fatal: ambiguous argument ''@{u}'': unknown revision or path not in the working tree. Use ''--'' to separate paths from revisions, like this: ''git <command> [<revision>...] -- [<file>...]''

Pero como esto es un error, no me permitirá usarlo ni canalizarlo a otros comandos. Tengo la intención de usar esto como una secuencia de comandos de shell alias '' git-delete-unbranched o tal vez hacer una gema super simple como git-branch-delete-orphans

¡Cualquier ayuda sería apreciada! Gracias


Edición tardía: mejor es

git for-each-ref --format=''%(refname:short) %(upstream)'' refs/heads / | awk ''$2 !~/^refs//remotes/''

en GNU / algo

for b in `git branch|sed s,..,,`; do git config --get branch.$b.remote|sed Q1 && echo git branch -D $b done

Si hubiera más de un puñado de ramas, habría mejores formas, usando comm -23 en la salida de git branch|sed|sort y git config -l|sed|sort .


Esto funciona para mí:

git branch -vv | grep -v origin

(Si su control remoto tiene otro nombre que no sea el origen, sustitúyalo).

Esto mostrará una lista de todas las ramas que no están rastreando un control remoto, que suena como lo que estás buscando.


Implementación de PowerShell en bruto: (si el origen es su único control remoto)

@($branches = git br -r; git branch | %{ echo $_ | sed ''s/..//'' }) ` | %{ if (($branches | ss "origin/$_") -eq $null) { ` echo "git branch -D $_" ` } ` }


Recientemente descubrí git branch -vv que es la versión "muy verbosa" del comando git branch .

Emite las ramas junto con las ramas remotas si existen, en el siguiente formato:

25-timeout-error-with-many-targets 206a5fa WIP: batch insert 31-target-suggestions f5bdce6 [origin/31-target-suggestions] Create target suggestion for team and list on save * 54-feedback-link b98e97c [origin/54-feedback-link] WIP: Feedback link in mail 65-digest-double-publish 2de4150 WIP: publishing-state

Una vez que tenga este resultado con un formato agradable, es tan fácil como pasarlo por cut e awk para obtener su lista:

git branch -vv | cut -c 3- | awk ''$3 !~//[/ { print $1 }''

Resultados en el siguiente resultado:

25-timeout-error-with-many-targets 65-digest-double-publish

La parte de cut simplemente normaliza los datos al eliminar los dos primeros caracteres (incluido * ) de la salida antes de pasarlo a awk .

La porción awk imprime la primera columna si no hay corchetes en la tercera columna.

Bono: crea un alias

Facilite su ejecución creando un alias en su archivo global .gitconfig (o donde sea):

[alias] local-branches = !git branch -vv | cut -c 3- | awk ''$3 !~///[/ { print $1 }''

Importante: la barra invertida debe escaparse en el alias o, de lo contrario, tendrá un archivo gitconfig no válido.

Bonificación: filtrado remoto

Si por alguna razón tiene múltiples controles remotos de seguimiento para diferentes sucursales, es bastante fácil especificar con qué control remoto desea verificar. Simplemente agregue el nombre remoto al patrón awk. En mi caso, es origin así que puedo hacer esto:

git branch -vv | cut -c 3- | awk ''$3 !~//[origin/ { print $1 }''


Tengo un problema similar. Quiero eliminar todas las sucursales locales que estaban rastreando sucursales remotas que ahora están eliminadas. Estoy descubriendo que git remote prune origin fue insuficiente para eliminar las ramas que quiero que desaparezcan. Una vez que se borre el control remoto, quiero que el local también se vaya. Esto es lo que funcionó para mí:

De mi ~/.gitconfig :

[alias] prune-branches = !git remote prune origin && git branch -vv | grep '': gone]'' | awk ''{print $1}'' | xargs -r git branch -d

EDITAR: Según lo solicitado, aquí hay un comando git config --global ... para agregar fácilmente esto como git prune-branches :

git config --global alias.prune-branches ''!git remote prune origin && git branch -vv | grep ''"''"'': gone]''"''"'' | awk ''"''"''{print $1}''"''"'' | xargs -r git branch -d''

NOTA : Cambié el -d a -D en mi configuración actual porque no quiero escuchar que Git se queje de las ramas no fusionadas. Es posible que desee esta funcionalidad también. Si es así, simplemente use -D lugar de -d al final de ese comando.

Además, FWIW, su archivo de configuración global casi siempre sería ~/.gitconfig .

EDITAR: (Corrección OSX) Como está escrito, esto no funciona en OSX debido al uso de xargs -r (gracias, Korny ).

El -r es para evitar que xargs ejecute git branch -d sin nombre de rama, lo que dará como resultado un mensaje de error " fatal: branch name required ". Si no le importa el mensaje de error, simplemente puede eliminar el argumento -r para xargs y ya está todo listo.

Sin embargo, si no desea ver un mensaje de error (y realmente, quién podría culparlo) entonces necesitará algo más que busque una tubería vacía. Si puede usar ifne de moreutils . ifne insertar ifne antes de ifne , lo que evitará que xargs ejecute con datos vacíos. NOTA : ifne considera que algo no está vacío, esto incluye líneas en blanco, por lo que aún puede ver ese mensaje de error. No he probado esto en OSX.

Aquí está esa línea de git config con ifne :

git config --global alias.prune-branches ''!git remote prune origin && git branch -vv | grep ''"''"'': gone]''"''"'' | awk ''"''"''{print $1}''"''"'' | ifne xargs git branch -d''


git branch (sin opciones) enumera solo las ramas locales, pero no se sabe si están rastreando una rama remota o no.

Por lo general, esas ramas locales deben eliminarse una vez fusionadas en master (como se ve en este número de git-sweep ):

git branch --merged master | grep -v master | xargs git branch -d

Esto no es tan completo como usted desea, pero es un comienzo.

Con las ramas fusionadas y únicas fusionadas en la confirmación nombrada (es decir, las ramas cuyas confirmaciones de punta son alcanzables desde la confirmación nombrada) se enumerarán.