Git nie wypycha zmian na github po wypchnięciu zmian z innego komputera


1

Mam następującą konfigurację dotyczącą Git:

  • Mały serwer z systemem Arch Linux i domyślnym klientem Git. Mam tę konfigurację, aby automatycznie wprowadzać zmiany w niektórych plikach, a następnie przekazywać je do mojego repozytorium Github.
  • Mój komputer z systemem Windows 8.1 z zainstalowanym SmartGit. Czasami wprowadzam zmiany w plikach, które następnie ręcznie wypycham do mojego repozytorium Github.

Problem, który mam, polega na tym, że kiedy dokonuję pewnych zmian w plikach na moim komputerze z systemem Windows, a następnie wypycham te zmiany, mój serwer Arch Linux najwyraźniej traci możliwość wypchnięcia swoich zmian do zdalnego repozytorium. Klient Arch Linux jest w stanie bez problemu przesuwać zautomatyzowane zmiany, dopóki nie wypchnę czegoś z komputerem z systemem Windows. Po tym coś się psuje. Znalazłem jedyny sposób, który rozwiązuje ten problem, to usunięcie lokalnego repozytorium na moim serwerze Arch Linux, a następnie utworzenie nowego lokalnego repozytorium poprzez pobranie ze zdalnego.

Skrypty skryptowe klienta Arch Linux pobierały i pobierały ze zdalnego repozytorium przed wprowadzeniem jakichkolwiek zmian i robię to samo, kiedy wprowadzam zmiany na komputerze.

Czy ktoś może mi pomóc dowiedzieć się, dlaczego tak się dzieje i co mogę zrobić, aby zapobiec występowaniu tego problemu w przyszłości? Pomoc będzie bardzo mile widziana.

Oto skrypty, których używam na moim serwerze Arch Linux:

Główny skrypt:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

# Test if an internet connection is present
ping -c 3 google.com > /dev/null 2> /dev/null
if [ $? != 0 ]; then
        exit 1
fi

# Git requires that the working directory be the repository I am working with
cd /home/git-user/repositories/xjdhdr-random-code

# Update local repository to ensure no conflicts exist before I make changes
/home/git-user/bin/expect-gitpull.sh

# snip: Everything between these two commands basically make a lot of changes to a lot of text files. Probably has nothing to do with Git or my problem.

# Commit changes to remote repository.
cd /home/git-user/repositories/xjdhdr-random-code
git add -A -f --ignore-errors --
git commit -m "Automatic commit of machine generated changes to repository" --no-edit --


/home/git-user/bin/expect-gitpush.sh

exit 0

/home/git-user/bin/expect-gitpull.sh

#!/bin/expect

set password {*don't need anyone to see my passphrase*}

cd /home/git-user/repositories/xjdhdr-random-code

spawn git pull origin

expect "Enter passphrase for key '/home/git-user/.ssh/id_rsa':"

send -- "$password\r"

send -- "\r"

expect "%PROMPT%"

spawn git fetch -p origin

expect "Enter passphrase for key '/home/git-user/.ssh/id_rsa':"

send -- "$password\r"

send -- "\r"

expect "%PROMPT%"

/home/git-user/bin/expect-gitpush.sh

#!/bin/expect

set password {*ditto*}

cd /home/git-user/repositories/xjdhdr-random-code

spawn git push --recurse-submodules=check

expect "Enter passphrase for key '/home/git-user/.ssh/id_rsa':"

send -- "$password\r"

send -- "\r"

expect "%PROMPT%"

Btw: Możesz usunąć hasło klucza SSH, eliminując potrzebę tego ... potworności. A potem musisz spojrzeć na wynik nieudanego wypychania.
Daniel B,

Zgodnie z twoją radą udało mi się dowiedzieć, dlaczego moje skrypty nie działają. Podałem powód poniżej.
XJDHDR,

A jeśli chodzi o klucz SSH i hasła, mógłbym je utworzyć bez hasła, ale dokumentacja, którą przeczytałem, odradzała to.
XJDHDR,

Nie robi dużej różnicy, jeśli i tak musisz zapisać hasło do skryptu.
Daniel B

Odpowiedzi:


0

Zrozumiałem na czym polega problem. Domyślnie oczekiwanie jest ustawione tak, aby wszelkie polecenia Oczekiwanie przekroczyły limit czasu po 10 sekundach, jeśli nie pojawi się ciąg znaków, na który mieli czekać. W moim przypadku oczekiwanie „% PROMPT%” przekroczyło limit czasu podczas działania polecenia „git push”. A ponieważ później nie było już innych poleceń, skrypt został zakończony. Oznaczało to, że push nie mógł zostać pomyślnie zakończony.

Rozwiązaniem jest dodanie ustawionego limitu czasu X w górnej części skryptu, zastępując X liczbą sekund, którą chcesz oczekiwać (lub użyj -1, jeśli chcesz czekać bez końca).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.