Blog

Aby życie było ciut prostsze

Programowanie

#linux#bash#git#script#lifehack

Опубліковано 17.12.2024

Aby życie było ciut prostsze

Dziś będzie krótko, ale treściwie. Pomysł na ten wpis przyszedł mi, kiedy opisywałem setup projektu, który wspólnie tworzymy.

W jednym z akapitów pisałem tam, że podczas pierwszego pusha na nowym branchu musimy wcześniej ten branch skonfigurować dla naszego origina. Niby nic skomplikowanego, bo git sam nam komendę podpowiada i wystarczy ją jedynie skopiować do konsoli.

Ale czy nie da się jeszcze łatwiej? Otóż oczywiście, że tak! I tym się dzisiaj zajmiemy.

Piszemy skrypty

W pierwszej kolejności trzeba stworzyć skrypt, który będzie odpowiedzialny za konfigurację naszego pusha.

Zastanówmy się, co ten skrypt musi robić?

  • jeśli branch nie jest skonfigurowany, to musi zwrócić polecenie git push --set-upstream origin <nazwa-brancha>
  • jeśli branch jest już skonfigurowany, to zwraca zwykłe git push

w tym celu musimy najpierw pobrać nazwę aktualnego brancha, na którym pracujemy lokalnie. Posłuży nam do tego linijka current_branch=$(git branch --show-current)

Tworzymy tu zmienną current_branch, do której przypisujemy nazwę bieżącego brancha.

Następnie sprawdzamy, czy nasz branch jest już skonfigurowany zdalnie: upstream_info=$(git rev-parse --abbrev-ref --symbolic-full-name "@{u}" 2>/dev/null)

Kolejno, używając dobrodziejstw instrukcji if else wykonujemy nasz skrypt w zależność od warunku:

if [ -z "$upstream_info" ]; then
    git push --set-upstream origin "$current_branch"
else
    git push

Teraz trzeba poskładać to w całość. Tworzymy plik git-auto-push.sh (nazwa dowolna).

nano git-auto-push.sh

Wstawiamy do niego poniższy kod i zapisujemy zmiany.

#!/bin/bash

# Pobierz nazwę bieżącego brancha
current_branch=$(git branch --show-current)

# Sprawdź, czy branch ma skonfigurowany upstream
upstream_info=$(git rev-parse --abbrev-ref --symbolic-full-name "@{u}" 2>/dev/null)

# Jeśli upstream nie jest skonfigurowany, ustaw go automatycznie
if [ -z "$upstream_info" ]; then
    git push --set-upstream origin "$current_branch"
else
    git push
fi

Teraz praktyka

Super, mamy już nasz skrypt. Jak go jednak użyć?

Po pierwsze musimy nadać mu odpowiednie uprawnienia:

chmod +x git-auto-push.sh

Teraz można go wywołać w konsoli poprzez ./git-auto-push.sh

Nie wygląda to za ciekawie, prawda? Tym bardziej, że za każdym razem będziemy musieli pamiętać, żeby odwołać się do lokalizacji tego pliku. Uprośćmy to zatem!

Przenosimy plik w jakieś sensowniejsze miejsce, np. /usr/local/bin/

mv git-auto-push.sh /usr/local/bin/git-auto-push

Teraz powinniśmy móc wywołać skrypt samym git-auto-push. Lepiej. Ale można jeszcze łatwiej.

Utwórzmy alias. Przechodzimy do pliku .bashrc (np. za pomocą nano ~/.bashrc). Tam dodajemy poniższą linijkę (sugeruję na końcu pliku):

alias gpush="/usr/local/bin/git-auto-push.sh"

Gotowe! Od tej pory możemy pushować nasz kod za pomocą polecenia gpush!

A gdyby tak...

Ale ja nie chcę używać jakiegoś gpusha. Ja chcę korzystać nadal ze zwykłego git push. Mogę?

Możesz. Ale to ciut bardziej skomplikowana kwestia.

Nie da się stworzyć aliasu zawierającego dwa wyrazy, np. alias 'git push'=cośtam. Ale da się to obejść. Napiszmy własną funkcję!

Pozostając w .bashrc usuwamy nasz alias gpush i zamiast niego wpisujemy:

function git() {
    if [ "$1" == "push" ]; then
        /usr/local/bin/git-auto-push.sh "${@:2}"
    else
        command git "$@"
    fi
}

Powyższa funkcja sprawdza, czy otrzymuje polecenie git. Jeśli tak, to kolejno weryfikuje, czy pierwszym argumentem po git jest push. W takim przypadku wywołuje skrypt git-auto-push.sh. W przeciwnym razie wykonuje standardowe polecenie git z podanymi argumentami.

Pozostało nam uruchomić ponownie terminal (lub załadować zmiany w .bashrc za pomocą source ~/.bashrc).

I gotowe! Od tej pory, jeśli użyjecie polecenia git push, to tak naprawdę uruchomicie skrypt, który w razie potrzeby za was skonfiguruje branch na repozytorium zdalnym.

Tyle ode mnie 😊 Tradycyjnie zapraszam na mojego twixera 😊

Do następnego!