git ajouter, valider et pousser des commandes en un?


220

Existe-t-il un moyen d'utiliser ces trois commandes en une seule?

git add .
git commit -a -m "commit" (do not need commit message either)
git push

Parfois, je modifie une seule lettre, un remplissage CSS ou quelque chose. Pourtant, je dois écrire les trois commandes pour pousser les changements. Il y a beaucoup de projets où je ne suis qu'un pousseur, donc cette commande serait géniale!


10
Avez-vous essayé d'écrire un script shell?
Paul


Il y a beaucoup de changements dans mon code, lorsque vous changez juste un remplissage en CSS, ou une lettre et etc. Les messages de validation et toutes ces commandes ajoutent beaucoup de travail. Pas essayé un script shell. Comment cela peut-il être fait? Merci!
Gediminas

2
"(pas besoin non plus de message de validation)" images.wikia.com/dragonball/images/a/a7/Facepalm_227785.jpg
Ajedi32

2
si vous effectuez une validation pour chaque instance unique d'un changement, vous le faites mal. faites la commande lorsque votre fonctionnalité est terminée ou que le bug est résolu (cela pourrait être un seul changement)
Mark

Réponses:


234

S'appuyant sur la réponse de @ Gavin:

Faire de lazygit une fonction au lieu d'un alias vous permet de lui passer un argument. J'ai ajouté ce qui suit à mon .bashrc (ou .bash_profile si Mac):

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Cela vous permet de fournir un message de validation, tel que

lazygit "My commit msg"

Vous pouvez bien sûr étoffer cela encore plus en acceptant encore plus d'arguments, tels que l'endroit éloigné vers lequel pousser ou la branche.


10
Redémarrage non nécessaire, il suffit de faire "source .bashrc"
Sambit Tripathy

25
pourrait utiliser $*au lieu d' $1enregistrer en tapant les guillemets:lazygit My commit msg
Kai Carver

16
@KaiCarver Belle pensée, mais personnellement je n'aime pas ça. Il vous empêche d'utiliser plusieurs arguments et va également à l'encontre de la convention normale d'un seul argument de chaîne avec des espaces entre guillemets. C'est une seconde nature pour moi à ce stade (et je suppose que beaucoup de développeurs). Oublier les citations semble sale.
btse

6
lazygit, meilleur nom de tous les temps!
user1447414

4
@btse moi être diplomate + c'est vendredi. Voici la fonction utilisant la suggestion @KaiCarver: function dirtygit() { git add . git commit -a -m "$*" git push }
OnklMaps

84

J'ai fini par ajouter un alias à mon .gitconfigfichier:

[alias]
    cmp = "!f() { git add -A && git commit -m \"$@\" && git push; }; f"

Usage: git cmp "Long commit message goes here"

Ajoute tous les fichiers, puis utilise le commentaire pour le message de validation et le pousse jusqu'à l'origine.

Je pense que c'est une meilleure solution car vous contrôlez le message de validation.

L'alias peut également être défini à partir de la ligne de commande, cela l'ajoute à votre .gitconfig:

git config --global alias.cmp '!f() { git add -A && git commit -m "$@" && git push; }; f'

6
C'est exactement ce que je cherchais! Fonctionne parfaitement, merci! Je n'ai pas pu trouver une référence de syntaxe complète ou une liste détaillée des commandes. Que fait !f() { ... }; fexactement? Plus d'explications sur cette ligne rendraient la réponse encore meilleure.
Dmitriy Gamolin

1
@DmitriyDemir Il définit la fonction f, puis l'appelle.
Oliver

Fonctionne très bien. J'ai ajouté git pullau début pour que les fusions soient réduites.
Burhan

1
@Oliver Pourquoi est-ce entre guillemets? Pourquoi y a-t-il un point d'exclamation? Le f à la fin appelle-t-il la fonction? Qu'est-ce que "$ @"?
Philip Rego

@PhilipRego Wrong Oliver: p
Oliver

53

Bien que je sois d'accord avec Wayne Werner sur ses doutes, c'est techniquement une option:

git config alias.acp '! git commit -a -m "commit" && git push'

Ce qui définit un alias qui s'exécute commitet push. Utilisez-le comme git acp. Veuillez noter que de tels alias "shell" sont toujours exécutés à partir de la racine de votre référentiel git.

Une autre option pourrait être d'écrire un hook post-commit qui fait le push.

Oh, au fait, vous pouvez en effet passer des arguments aux shell alias. Si vous souhaitez transmettre un message de validation personnalisé, utilisez plutôt:

git config alias.acp '! acp() { git commit -a -m "$1" && git push ; } ; acp'

(Bien sûr, maintenant, vous devrez donner un message de validation: git acp "My message goes here!")


@wlz Je viens de l'essayer et cela fonctionne bien. Notez que la chaîne entière est entre guillemets simples. gitajouté automatiquement les échappements (vérifié avec git config -e).
Tilman Vogel

Désolé, vous avez raison :). Je modifie directement le fichier .gitconfig. Le "s'est déjà échappé avec \".
wlz

2
Pourquoi n'est-ce pas la réponse acceptée? Il fait ce qui a été demandé. +1.
lucid_dreamer

1
Sous Windows, je devais échapper aux guillemets doubles autour de $ 1 pour le faire fonctionner à partir de PowerShell (en utilisant ... \ "$ 1 \" ...)
DReimer

35

Je pense que vous pourriez mal comprendre le workflow pour lequel git a été conçu. (Pour clarifier / corriger ce que je voulais dire dans le commentaire, vous n'avez pas besoin de le git add ., car il commit -asert généralement le même but - ajouter des modifications qui n'ont pas encore été mises en scène, si les fichiers ont déjà été ajoutés)

En général, vous ferez quelque chose comme ceci:

# make some changes
$ git commit -a -m "Changed something"
# make some more changes
$ git commit -a -m "Changed something else"

laver, rincer, répéter jusqu'à ce que vous ayez terminé la fonction X, ou que vous soyez à un point d'arrêt, ou que vous vouliez simplement que d'autres personnes voient ce que vous avez fait. Alors tu fais

$ git push

Git n'est pas SVN - mais il semble que vous essayez de l'utiliser en tant que tel. Vous trouverez peut-être certaines des ressources à la fin de l'article ici utiles.


6
+1 pour l'explication du workflow. Cependant git add .et ce git commit -a n'est pas la même chose
Gabriele Petronella

5
Merci pour l'explication, mais GIT ne s'effondrera pas s'il y aura une commande comme celle-ci pour ceux qui savent ce qu'ils font ...
Gediminas

4
@Lucas: Les programmeurs expérimentés vous diront que les personnes qui demandent une commande commit-push automatique ne savent pas ce qu'elles font. Il y a une raison pour l'archivage de code en 3 étapes (si vous utilisez des branches de fonctionnalités, en 4 étapes).
slebetman

1
@slebetman: Je ne l'ai pas expliqué correctement. Avec les applications Facebook, chaque modification doit être déployée sur le serveur en direct, même pour le développement. Nous avons donc configuré des hooks de validation pour ce faire. Vous effectuez un changement, le validez et voyez le changement dans votre application. Avec git, je dois ajouter, mettre en scène puis pousser pour voir un seul changement. N'est-ce pas exagéré?
SenG

1
Oui, mais vous n'avez pas non plus besoin de vous engager à tester votre code. Vous devez écrire du code, le tester, puis valider et pousser. L'utilisation légendaire de git local s'engage à fournir une sorte de fonctionnalité "d'annulation" multi-fichiers utilisée beaucoup plus dans la légende que dans la réalité, selon mon expérience.
Joe Strout

35

J'utilise ceci dans mon .bash_profile

gitpush() {
    git add .
    git commit -m "$*"
    git push
}
alias gp=gitpush

Il s'exécute comme

gp A really long commit message

N'oubliez pas de courir source ~/.bash_profileaprès avoir enregistré l'alias.


1
J'aime vraiment ça. ... et l'ont donc adopté dans mon propre ~ / .bash_profile;) merci .. +1
AO_

28

Vous pouvez utiliser le script bash, définir un alias pour lancer n'importe quelle commande ou groupe de commandes

git commit -am "your message" && git push 

2
Si vous souhaitez en faire une réponse, veuillez ajouter plus de commentaires sur la façon dont cela fonctionne. Les réponses qui sont simplement un vidage de code ne sont généralement pas bien reçues. Voir Comment répondre .
Heretic Monkey

Je pense que cela devrait être la bonne réponse. Comme il répond à la question aussi succinctement que possible. Tapez-le simplement dans le terminal et cela fonctionne! Si vous ne voulez pas ajouter d'alias, une alternative serait de simplement créer une extension textExpander et de la déclencher via une combinaison de touches.
eonist

19

Défini comme un alias dans bash:

$ alias lazygit="git add .; git commit -a -m '...'; git push;";

Appeler:

$ lazygit

(Pour rendre cet alias permanent, vous devez l'inclure dans votre .bashrc ou .bash_profile)


Vous en auriez besoin pour ajouter cet alias à .bashrc ou .bash_profile pour le rendre permanent
Gavin

Je pense que cette page peut aider à expliquer: serverfault.com/questions/3743/…
Gavin

17

La solution la plus simple serait de:

git commit -a -m "commit" && git push

git add est déjà contenu dans le paramètre -a de commit, mais si vous le souhaitez, vous pouvez tous les connecter:

git add . && git commit -a -m "commit" && git push

10

Sous Linux / Mac, cette option très pratique devrait également fonctionner

git commit -am "IssueNumberIAmWorkingOn --hit Enter key
> A detail here --Enter
> Another detail here --Enter
> Third line here" && git push --last Enter and it will be there

Si vous travaillez sur une nouvelle branche créée localement, changez la git pushpièce avecgit push -u origin branch_name

Si vous souhaitez modifier votre message de validation dans l'éditeur système,

git commit -a && git push 

ouvrira l'éditeur et une fois que vous aurez enregistré le message, il le poussera également.


8

Vous pouvez essayer gitu .

Pour la première fois (le nœud js doit être installé):

npm install -g git-upload

Après ça:

gitu COMMIT_MSG

Pour émettre ces trois commandes à la fois.

La bonne chose est que vous n'avez pas à vous inquiéter lorsque vous réinstallez votre système ou lorsque vous souhaitez le faire sur différents ordinateurs et aucune modification de fichier n'est nécessaire. Cela fonctionne également sur différentes plates-formes (pas seulement Linux et Mac, mais aussi Windows sous invite de commande comme cmdet powershell) juste que vous devez installer npmet nodejs( gitbien sûr).


6

Si le fichier est déjà suivi, vous n'avez pas besoin de l'exécuter git add, vous pouvez simplement écriregit commit -am 'your message'

Si vous ne voulez pas écrire de message de validation, vous pourriez envisager de faire quelque chose comme

git commit --allow-empty-message -am ''



3

Comme mentionné dans cette réponse, vous pouvez créer un alias git et lui affecter un ensemble de commandes. Dans ce cas, ce serait:

git config --global alias.add-com-push '!git add . && git commit -a -m "commit" && git push'

et l'utiliser avec

git add-com-push

1
Cela n'ajoute rien à aucune des réponses précédentes.
BanksySan

Je suis désolé, tu as raison. Je pense que je n'ai pas remarqué que la réponse de Tilman Vogel était la même que la mienne. Dois-je la supprimer ??
cristianzamar

3

Écrivez un petit script nommé gitpush.sh avec les lignes ci-dessous et ajoutez-le à votre répertoire ~.

echo $1
git add .
git commit -m "$1"
git push

Ajoutez maintenant un alias dans ~ / .bashrc comme ci-dessous:

alias gitpush='~/gitpush'

Maintenant, à partir de n'importe quel dépôt git, écrivez simplement "message" gitpush.


2

J'utilise un fichier batch:

@ECHO OFF
SET /p comment=Comment:
git add *
git commit -a -m "%comment%"
git push

les prob seraient plus faciles si vous acceptiez dans les arguments de la ligne de commande. je vais simplement "lezygit MESSAGE" etc. son assez cool!
John Hon

1

Il y a quelques problèmes avec les scripts ci-dessus:

shift "supprime" le paramètre $ 1, sinon, "push" le lira et "le comprendra mal".

Mon conseil:

git config --global alias.acpp '! git add -A && branchatu = "$ (git symbolic-ref HEAD 2> / dev / null)" && branchatu = $ {branchatu ## refs / heads /} && git commit - m "$ 1" && shift && git pull -u origin $ branchatu && git push -u origin $ branchatu '


1

Lorsque vous voulez un comportement semblable à svn de git commit, utilisez-le dans vos alias git dans votre .gitconfig

commit = "!f() { git commit \"$@\" && git push; };f"


1

Si vous utilisez une coquille de poisson (à partir de la réponse de btse):

Enregistrez ce fichier dans «~ / .config / fish / functions» sous «quickgit.fish». Créez le répertoire s'il n'existe pas. '--git-dir = $ PWD / .git' Garantit que nous exécutons les commandes git sur le projet git où nous avons appelé la fonction

function quickgit # This is the function name and command we call
    git --git-dir=$PWD/.git add . # Stage all unstaged files
    git --git-dir=$PWD/.git commit -a -m $argv # Commit files with the given argument as the commit message
    git --git-dir=$PWD/.git push # Push to remote
end

Redémarrez le terminal, accédez au projet, apportez des modifications et vous pouvez maintenant appeler "quickgit" exemple de message "'. Les modifications seront désormais ajoutées, validées et poussées :).

Vous pouvez également trouver un Gist ici: https://gist.github.com/Abushawish/3440a6087c212bd67ce1e93f8d283a69


1

Il existe déjà de nombreuses bonnes solutions, mais voici une solution que je trouve plus élégante pour la façon dont je veux travailler:

J'ai mis un script sur mon chemin appelé "git-put" qui contient:

#!/bin/bash
git commit "$@" && git push -u

Cela me permet de courir:

git put -am "mon message de validation"

..pour ajouter tous les fichiers, les valider et les pousser.

(J'ai également ajouté le "-u" parce que j'aime le faire de toute façon, même s'il n'est pas lié à ce problème. Il garantit que la branche en amont est toujours configurée pour l'extraction.)

J'aime cette approche car elle permet également d'utiliser "git put" sans ajouter tous les fichiers (sauter le "-a"), ou avec toute autre option que je pourrais vouloir passer pour valider. De plus, "put" est un petit mot de "push" et "commit"


1

Si vous utilisez VSCode, vous pouvez télécharger cette extension qui vous permettra de le faire dans un simple raccourci clavier.


1

Si vous utilisez un Mac:

  1. Démarrez Terminal Type "cd ~ /" pour accéder à votre dossier personnel

  2. Tapez "touch .bash_profile" pour créer votre nouveau fichier.

  3. Modifiez .bash_profile avec votre éditeur préféré (ou vous pouvez simplement taper "open -e .bash_profile" pour l'ouvrir dans TextEdit).

  4. Copiez et collez ce qui suit dans le fichier:

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Après cela, redémarrez votre terminal et ajoutez, validez et appuyez simplement sur une commande simple, par exemple:

lazygit "This is my commit message"

1

Pour les utilisateurs de MAC VSC, la meilleure configuration est:

1) appuyez sur 'shift + cmd + P' et tapez:

Shell Command: install 'code' command in PATH

Appuyez sur ENTRÉE (cela installera la commande de code pour accéder facilement au bash_profile)

2) vous pouvez maintenant exécuter: code ~/.bash_profilepour ouvrir le bash_profile vide

3) entrez une nouvelle fonction:

function lazygit() {
    git add .
    git commit -m "$*"
    git push
}

4) redémarrez maintenant VSC

5) Apportez une modification, enregistrez-la et tapez lazygit messagepour exécuter les trois commandes simultanément


1

Pour les utilisateurs de macOS:

  1. Ouvrez votre terminal ou iTerm2 ou un autre terminal que vous utilisez.

  2. Accédez à votre dossier de profil utilisateur avec la commande ~/. C'est un dossier par défaut pour le .bash_profilefichier:

Exemple de dossier utilisateur

  1. Tapez nano .bash_profileCette commande ouvrira le .bash_profiledocument (ou le créera s'il n'existe pas déjà) dans l'éditeur de texte le plus simple à utiliser pour le terminal - nano.

  2. Vous pouvez maintenant apporter une modification simple au fichier. Collez ces lignes de code pour modifier votre invite de terminal:

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Édition de nano texte

  1. Maintenant, enregistrez vos modifications en tapant ctrl + oet en appuyant sur Retour pour enregistrer. Quittez ensuite nanoen tapant ctrl + x.

  2. Nous devons maintenant activer vos modifications. Tapez source .bash_profile(ou . ~/.bash_profile) et regardez votre changement rapide.

  3. Dans iTerm2, Preferences/Profiles/General/Commandréglez sur Login Shellet Send text at startsur source ~/.bash_profile. Vous n'avez donc pas besoin de le faire manuellement après chaque redémarrage de macOS. Préférences iTerm 2

Informations d'identification: https://natelandau.com/my-mac-osx-bash_profile


0

J'ai fait ce script .sh pour la commande

#!/bin/sh
cd LOCALDIRECTORYNAME/  
git config --global user.email "YOURMAILADDRESS"
git config --global user.name "YOURUSERNAME"
git init
git status
git add -A && git commit -m "MASSAGEFORCOMMITS"
git push origin master

0

Puisque la question ne spécifie pas quel shell, voici la version eshell basée sur les réponses précédentes. Cela va dans le fichier d'alias eshell, qui pourrait être dans ~ / .emacs.d / eshell / alias J'ai ajouté la première partie z https://github.com/rupa/z/ qui vous permet de cd rapidement dans un répertoire , afin que cela puisse être exécuté quel que soit votre répertoire actuel.

alias census z cens; git add .; git commit -m "fast"; git push

0

Ajoutez ~/.bash_profilepour ajouter, valider et pousser avec une seule commande:

function g() { git commit -a -m "$*"; git push; }

Usage:

g your commit message
g your commit message 'message'

Aucune citation n'est nécessaire, bien que vous ne puissiez pas utiliser de points-virgules ni de parenthèses dans vos messages de validation (les guillemets simples sont autorisés). Si vous le souhaitez, mettez simplement des guillemets doubles dans votre message, par exemple:

g "your commit message; (message)"

Pour créer un commentaire dans votre message, procédez comme suit:

g "your commit message:
> your note"

Il existe également une fonction pour ajouter et valider de la même manière:

function c() { git add --all; git commit -m "$*"; }

Fonctionne exactement de la même manière que la gfonction et a les mêmes contraintes. Mettez juste à la cplace. Par exemple

c your commit message

Vous pouvez également ajouter un alias pour pousser vers la télécommande:

alias p='git push'

Usage:

p

Cela équivaut à 2 lettres, cet pvous utilisez tout en travaillant avec votre référentiel git. Ou vous pouvez utiliser à la gplace pour tout faire avec une seule lettre.

Liste complète des alias et des fonctions: https://gist.github.com/matt360/0c5765d6f0579a5aa74641bc47ae50ac


0

En s'appuyant sur la lazygitréponse, la solution suivante ajoute une vérification utilisateur pour vérifier les modifications avant de pousser. Il annulera les commandes en cas d'annulation. Et tout cela se produira si et seulement s'il y a des changements dans le référentiel local.

### SAFER LAZY GIT
function lazygit() {
  git add .
  if git commit -a -m "$1"; then
    read -r -p "Are you sure you want to push these changes? [y/N]} " response
    case "$response" in
      [yY][eE][sS]|[yY])
        git push
        ;;
      *)
        git reset HEAD~1 --soft
        echo "Reverted changes."
        ;;
    esac
  fi
}

0

C'est parfait pour le regroupement de commandes.

Commandes de regroupement

{ liste; } Le fait de placer une liste de commandes entre accolades entraîne l'exécution de la liste dans le contexte shell actuel. Aucun sous-shell n'est créé. La liste suivante, point-virgule (ou nouvelle ligne) est requise.

legit(){ git add --all; git commit -m "$1"; git push origin master; }
legit 'your commit message here'

1
Cela ne fonctionnera pas si le message de validation a des espaces entre les deux
Rohit

0

J'aime exécuter ce qui suit:

git commit -am "message";git push

Je pense que le ;devrait être remplacé par &&dans votre commande, car le dernier n'exécutera la git pushcommande que s'il n'y a pas d'erreur sur la ou les commandes précédentes.
Tom

0

J'ai trouvé cet yolo alias incroyable pour même soumettre un commentaire aléatoire au commit pendant que je suis paresseux. Cela fonctionne vraiment bien hors de la boîte, donc je fais juste git yoloet toutes mes modifications sont poussées automatiquement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.