Załóżmy, że masz repozytorium pod adresem github.com/someone/repo
i rozwidlasz je do github.com/you/repo
. Chcesz użyć forka zamiast głównego repozytorium, więc wykonaj plik
go get github.com/you/repo
Teraz wszystkie ścieżki importu w tym repozytorium będą „zepsute”, co oznacza, że jeśli w repozytorium znajduje się wiele pakietów, które odwołują się do siebie poprzez bezwzględne adresy URL, będą one odnosić się do źródła, a nie do rozwidlenia.
Czy jest lepszy sposób, niż ręczne sklonowanie go do właściwej ścieżki?
git clone git@github.com:you/repo.git $GOPATH/src/github.com/someone/repo
ec2
paczkę - malaunchpad.net/goamz/aws
import. Zarówno pakiety , jakaws
iec2
pakiety znajdują się w TYM SAMYM repozytorium, więc po rozwidleniu nie będzie odwoływać się do właściwego pakietu (tego w rozwidleniu).Odpowiedzi:
Do obsługi żądań ściągnięcia
github.com/someone/repo
dogithub.com/you/repo
go get github.com/someone/repo
cd "$(go env GOPATH)/src"/github.com/someone/repo
git remote add myfork https://github.com/you/repo.git
git push myfork
http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html
Aby użyć pakietu w swoim projekcie
https://github.com/golang/go/wiki/PackageManagementTools
źródło
git remote add
? klon z widelca? sklonować z oryginału? od wewnątrz iść?Jeśli używasz modułów go . Możesz użyć
replace
dyrektywyMożesz więc zrobić to poniżej w swoim pliku go.mod
gdzie
v3.2.1
jest tag w twoim repozytorium. Można to również zrobić przez CLIźródło
go mod edit -replace
bezpośrednio w wierszu poleceń:go mod edit -replace="github.com/someone/[email protected]=github.com/you/[email protected]"
. Obie opcje@v...
są opcjonalne.go.mod.local
lubgo.mod.dev
którego rolą jest faktycznie zastąpienie ścieżki importu dla rozwoju lokalnego? Chodzi mi o to, że nigdy nie zapomnisz usunąć brzydkiego „zastąpienia”, ponieważ nie musiałbyś tego robić.Jednym ze sposobów rozwiązania tego problemu jest metoda zaproponowana przez Ivana Rave'a i http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html - sposób rozwidlenia.
Innym jest obejście zachowania golang . Kiedy ty
go get
, golang układa twoje katalogi pod taką samą nazwą jak w identyfikatorze URI repozytorium, i tutaj zaczyna się problem.Jeśli zamiast tego wydasz własne
git clone
, możesz sklonować swoje repozytorium do swojego systemu plików na ścieżce nazwanej tak, jak oryginalne repozytorium.Zakładając, że oryginalne repozytorium jest dostępne
github.com/awsome-org/tool
i rozwidlasz jegithub.com/awesome-you/tool
, możesz:golang jest całkowicie zadowolony z kontynuowania tego repozytorium i właściwie nie obchodzi go, że jakiś górny katalog ma taką nazwę,
awesome-org
podczas gdy zdalny git ma taką nazwęawesome-you
. Cały import dlaawesome-org
pliki są ponownie wyszukiwane za pośrednictwem właśnie utworzonego katalogu, który jest lokalnym zestawem roboczym.Szerzej , zobacz mój wpis na blogu: Rozwidlenie repozytoriów Golang na GitHub i zarządzanie ścieżką importu
edit : stała ścieżka katalogu
źródło
Jeśli twój fork jest tylko tymczasowy (tj. Zamierzasz go scalić), po prostu zrób swój rozwój in situ, np. In
$GOPATH/src/launchpad.net/goamz
. .Następnie używasz funkcji systemu kontroli wersji (np.
git remote
), Aby uczynić z repozytorium nadrzędnego repozytorium zamiast oryginalnego.Utrudnia to innym osobom korzystanie z twojego repozytorium,
go get
ale znacznie ułatwia jego integrację z nadrzędnym.W rzeczywistości mam repozytorium dla goamz, w
lp:~nick-craig-wood/goamz/goamz
którym rozwijam się dokładnie w ten sposób. Może autor kiedyś to połączy!źródło
go get
z mojego repozytorium, wszystkie moje instrukcje importu i takie będą nadal odzwierciedlaćgithub.com/original_author
i dlatego zostaną złamane ... prawda?Oto sposób, aby to działało dla każdego:
Użyj github, aby rozwidlić do „my / repo” (tylko przykład):
Powtarzaj za każdym razem, gdy ulepszysz kod:
Czemu? Dzięki temu masz repozytorium,
go get
z którym współpracuje. Pozwala również utrzymywać i ulepszać gałąź, która jest dobra dla żądania ściągnięcia. Nie nadyma gita „dostawcą”, zachowuje historię, a narzędzia do budowania mogą to nadać sens.źródło
Odpowiedź jest taka, że jeśli rozwidlisz repozytorium z wieloma pakietami, będziesz musiał zmienić nazwy wszystkich odpowiednich ścieżek importu. Jest to w dużej mierze dobra rzecz, ponieważ wszystkie te pakiety zostały rozwidlone, a ścieżki importu powinny to odzwierciedlać.
źródło
find
,xargs
ised
, ale pomogłoby to mieć bezbolesny przepływ pracy, który konsekwentnie działa dla każdego.gomvpkg
może łatwiej / lepiej zmieniać nazwy.go get golang.org/x/tools/cmd/gomvpkg
wtedygomvpkg -help
.Aby zautomatyzować ten proces, napisałem mały skrypt. Możesz znaleźć więcej szczegółów na moim blogu, aby dodać polecenie typu „gofork” do swojego basha.
źródło
golang
zmienić nagofork
w linii 4?Korzystaj ze sprzedaży i modułów podrzędnych razem
import
instrukcje w kodzie źródłowym, aby wskazywały folder dostawcy (bezvendor/
prefiksu). Np.vendor/bob/lib
=>import "bob/lib"
Na przykład
Czemu
To rozwiązuje wszystkie problemy, o których słyszałem i napotkałem, próbując rozwiązać to samodzielnie.
Więcej informacji
źródło
w swoim
Gopkg.toml
pliku dodaj te bloki poniżejWięc użyje rozwidlenia
project2
zamiastgithub.com/globalsign/mgo
źródło
Gopkg.toml
Plik jest używany tylko przezdep
które ta kwestia nie wspomina w ogóle. Nowe projekty Go powinny zamiast tego używać modułów Go (a istniejące projekty IMO oparte na depach powinny również zostać poddane migracji).Możesz użyć polecenia,
go get -f
aby uzyskać rozwidlone repozytoriumźródło