Jak skonfigurować git repo, aby wypychać, ponieważ obecnie pilot go odrzuca?

3

Chcę skonfigurować repozytorium GIT dla strony internetowej. Wielu użytkowników będzie miało klon repozytorium na swoim komputerze lokalnym i pod koniec każdego dnia wypychają swoją pracę na serwer. Mogę skonfigurować nagie repozytorium, ale chcę działające repozytorium dir / non-bare.

Chodzi o to, że katalog roboczy repozytorium będzie folderem głównym witryny. Pod koniec każdego dnia wszystkie zmiany będą widoczne bezpośrednio. Ale nie mogę znaleźć sposobu, aby to zrobić.

Zainicjowanie repozytorium serwera za pomocą git initpowoduje następujący błąd, gdy klient próbuje wypchnąć niektóre pliki:

git push origin master
[email protected]'s password: 
Counting objects: 3, done.
Writing objects: 100% (3/3), 227 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To ssh://[email protected]/home/orangetux/www/
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'ssh://[email protected]/home/orangetux/www/'

Zastanawiam się więc, czy to właściwy sposób na skonfigurowanie repozytorium GIT dla strony internetowej? Jeśli tak, jak mam to zrobić? Jeśli nie, to jaki jest lepszy sposób na skonfigurowanie repozytorium GIT do opracowania strony internetowej?

Widziałem, że nie możesz naciskać na repozytorium typu non-bare , ale jak to rozwiązuje mój problem? Utworzyć puste repozytorium na serwerze i mieć klon tego repozytorium na tym samym serwerze w folderze htdocs? To wydaje mi się trochę niezdarne. Aby zobaczyć wynik zatwierdzenia, muszę za każdym razem klonować repozytorium.

OrangeTux
źródło

Odpowiedzi:

4

Aby zobaczyć wynik zatwierdzenia, muszę za każdym razem klonować repozytorium.

Nie musisz ponownie klonować, tylko git pullnajnowsze zmiany za każdym razem.

Aby to zrobić automatycznie, wystarczy dodać odpowiednie polecenia do <barerepo>/hooks/post-updatehaka w swoim czystym repozytorium.

  • Metoda A: strona internetowa to pełny klon głównego repozytorium:

    #!/bin/sh
    git update-server-info
    if dir=$(git config hooks.checkoutTo); then
        for ref; do
            if [ "$ref" = "refs/heads/master" ]; then
                (unset GIT_DIR && cd "$dir" && git pull --quiet --ff-only)
            fi
        done
    fi
    

    Wskazówka: Jeśli oba repozytoria znajdują się na tej samej maszynie, użyj, git clone --shared /path/to/bareaby zaoszczędzić miejsce poprzez ponowne użycie katalogu obiektowego repozytorium.

    Uwaga: Możliwe są problemy z bezpieczeństwem w metodzie A - osoba z zewnątrz może po prostu pobrać .gitkatalog z kodem źródłowym witryny, jeśli nie przeniesiesz go do innej lokalizacji.

  • Metoda B, strona internetowa jest tylko kasą:

    #!/bin/sh
    git update-server-info
    if dir=$(git config hooks.checkoutTo); then
        for ref; do
            if [ "$ref" = "refs/heads/master" ]; then
                # Must give a path (such as ".") to avoid switching HEAD.
                git --work-tree="$dir" checkout -f "$ref" -- .
            fi
        done
    fi
    

W przypadku obu haków uruchom git config hooks.checkoutTo /var/wwww pustym repozytorium (lub edytuj <barerepo>/configplik ręcznie), aby ustawić ścieżkę docelową.

Oba zaczepy są napisane, aby aktywować tylko po masterzaktualizowaniu gałęzi.

Upewnij się, że plik hook jest wykonywalny ( chmod +x). Szczegóły patrz githooks (5) .


Uwaga: Technicznie rzecz biorąc, możesz przesyłać do repozytorium, które nie jest puste - Git po prostu odrzuci wypychanie do aktualnie wyewidencjonowanej gałęzi (wypychanie do innych gałęzi jest w porządku). Nawet tę kontrolę można wyłączyć, ale jest to tylko zaproszenie do kłopotów ... Jest także znacznie czystsze i lepsze dla kopii zapasowych, aby przechowywać nagie repozytoria w jednym katalogu (np. ~/srv/gitLub ~/Public/Git).

grawitacja
źródło
Czy możesz wyjaśnić oba skrypty? Chociaż trochę znam się na szarpaniu Basha, nie rozumiem całkowicie obu skryptów.
OrangeTux,
0

[zdalne odrzucenie] master -> master

Jest odrzucany zdalnie, więc upewnij się, że repo, które wypychasz, jest aktualne, ponownie pociągając i pchając:

git pull; git push

Jeśli nadal odmawiasz, spróbuj najpierw pchnąć do innej gałęzi:

git push origin master:foo

aby właściciel repo mógł scalić Twój oddział.

Jeśli wprowadziłeś jakieś zmiany do zatwierdzeń przez rebase, prawdopodobnie prawdopodobnie chcesz to wymusić -f.

Alternatywnie wyłącz denyCurrentBranchzdalnie przez (nie zalecane):

git config receive.denyCurrentBranch ignore
kenorb
źródło