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%"
źródło
Odpowiedzi:
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).
źródło