[git] Πώς αλλάζω σε άλλο remote branch

Συχνα, πυκνα ή σχεδόν πάντα, θα πέσετε πάνω σε κάποιο open source project το οποίο χρειάζεται άλλα open-source projects, τα οποία χρειάζονται άλλα open-source projects προκειμένου να κάνετε compile. Φυσικά κάθε project το διαχειρίζεται αυτό διαφορετικά. Εν τέλη, όταν ψάξετε, ρωτήσετε και μάθετε, θα καταλήξετε στο τέλος ότι για να το κάνετε compile τότε χρειάζεστε να έχετε το τάδε binary στην τάδε έκδοση, και το τάδε binary στην άλλη εκδοση.

Ψάχνετε λοιπόν στον software package manager της διανομής σας και δεν βρίσκετε τίποτα. Ακόμα και να βρείτε, είναι πολύ πιθανό να βρίσκονται σε διαφορετική έκδοση από αυτή που χρειάζεται. Οπότε από εκεί που είχατε να κάνετε compile 1 πράγμα, τώρα έχετε να κάνετε 2 ή 3 ή 4 αναλόγως τα 3rd party dependencies.

Αυτό θα σας τύχει κυρίως όταν δουλεύετε με κάποιο framework. Φτιάχενετε δηλαδή μια εφαρμογή η οποία βασίζεται πάνω σε ένα framework. Οταν αλλάζει αυτό, τότε αλλάζει και η συμπεριφορά της εφαρμογής σας.

Για παράδειγμα:

Δουλεύω με τον AWS Account Operator για το RedHat Openshift. Για να τον κάνω compile και να τεστάρω τις αλλαγές μου σε αυτόν, χρειάζεται να έχω το operator-sdk binary εγκατεστημένο στον υπολογιστή μου. Ρωτησα λοιπον και εμαθα οτι πρεπει να εχω την εκδοση v0.8.x για να γίνει compile αυτή τη χρονική στιγμή.

Δύο τρόπους:

Θα σας δείξω τον 2ο τρόπο:

git clone <repo>; cd <repo>

Βρισκω όλα τα branches (συνηθως κάθε branch είναι και μία released εκδοση):

$ git branch -v -a


  master                              24b7dbad internal/cmd: add git commit logging in run subcommand (#3849)
* v0.8.x                              daf62d44 *: revert version from v0.8.2 to v0.8.x (#1728)
  remotes/origin/HEAD                 -> origin/master
  remotes/origin/asmacdo-patch-1      ce66bc58 Update OWNERS
  remotes/origin/branch-test          78ffa962 commit 2 after adding subdomain
  remotes/origin/bug-1701041          29df5a82 adding constant and todo for cache timeout
  remotes/origin/docs-website         422ae38e doc: fix link to memcached cr (#2211)
  remotes/origin/master               24b7dbad internal/cmd: add git commit logging in run subcommand (#3849)
  remotes/origin/release-4.2          3a85983e doc/dev/release.md: some cleanup and require samples repo update on a release (#1807)
  remotes/origin/release-4.3          79e63695 Add test/check sanity to check if test-framework mock data is updated (#2131)
  remotes/origin/release-4.4          79e63695 Add test/check sanity to check if test-framework mock data is updated (#2131)
  remotes/origin/upstream-kubebuilder f6756adb *: consume kubebuilder init and create cmds
  remotes/origin/v0.0.7               e5a0ab09 Merge pull request #624 from AlexNPavel/v0.0.7
  remotes/origin/v0.1.x               273df3f6 pkg/scaffold,version,changelog: bump to v0.1.1 (#696)
  remotes/origin/v0.10.x              fd8747ad *: release bump to v0.10.1+git (#2041)
  remotes/origin/v0.11.x              33b4008f *: bump to v0.11.0+git for v0.11.x (#2053)
  remotes/origin/v0.12.x              8ee75967 *: bump to v0.12.0+git for v0.12.x (#2136)
  remotes/origin/v0.13.x              38c9195d CHANGELOG.md: add leader election bugfix (#2210) (#2330)
  remotes/origin/v0.14.x              6058c3d0 *: post-v0.14.1 bumps (#2437)
  remotes/origin/v0.15.x              f5a4be92 docs: fixed reconcilePerdiod example and added a note for imagePullPolicy (#2653)
  remotes/origin/v0.16.x              0f450e8c v0.16.x post release branch setup (#2671)
  remotes/origin/v0.17.x              ed44796b *: post release v0.17.1 (#3056) (#3117)
  remotes/origin/v0.18.fake           1e74eda7 *: post release v0.18.0 (#3142)
  remotes/origin/v0.18.x              1e74eda7 *: post release v0.18.0 (#3142)
  remotes/origin/v0.2.x               d6541603 version,pkg/scaffold,changelog: update to v0.2.1 (#833)
  remotes/origin/v0.3.x               6c670aaa changelog: move the subresource note to correct section (#843)
  remotes/origin/v0.4.x               a94f1aa4 Handles watching dependent resources across namespace boundaries (#1153)
  remotes/origin/v0.5.x               889d07fa pkg/scaffold,version: bump to track v0.5.x branch (#1251)
  remotes/origin/v0.6.x               f4e92a09 Backport: commands/.../generate: verbose codegen by default (#1271) (#1279)
  remotes/origin/v0.7.x               50063119 *: bump to v0.7.1+git (#1452)
  remotes/origin/v0.8.x               daf62d44 *: revert version from v0.8.2 to v0.8.x (#1728)
  remotes/origin/v0.9.x               30574d64 CHANGELOG.md,doc/sdk-cli-reference.md: add --operator-name addition (#1716) (#1725)
(END)

Ok, βρηκα αυτο που θέλω, είναι το remote/origin/v0.8.x. Αρα αλλάζω τοπικά σε αυτό:

$ git checkout -b v0.8.x origin/v0.8.x

Η παραπάνω εντολή είναι απάντηση στον τίτλο αυτού του post :)

Ωραια, τώρα μένει να βρουμε πως το κάνουμε compile αυτο. Προσοχή όμως, θα πρέπει να βρούμε τις οδηγίες που αναφέρονται στην έκδοση v0.8.x καθώς είναι παρά πολύ πιθανό να είναι διαφορετικές από το τρέχων master. Οντως είναι:

Οπότε έδωσα:

make dep
make install

Και voila, έχω πλέον το 3rd dependency στην εκδοση που πρέπει:

$ operator-sdk version
operator-sdk version: v0.8.2-1-gdaf62d44, commit: daf62d44e47ed238aa6f2879d7e9ac9d15d01e7e

Tώρα μπορώ να πάω πίσω και να κάνω compile το αρχικό μου project, τον AWS Project Operator :smiley:

Πριν:

$ make deploy-local

Error: unknown command "up" for "operator-sdk"
Did you mean this?
	run
Run 'operator-sdk --help' for usage.
make: *** [deploy-local] Error 1

Μετα:

$ make deploy-local
INFO[0000] Running the operator locally.
INFO[0000] Using namespace aws-account-operator.
{"level":"info","ts":1599572973.484715,"logger":"cmd","msg":"Go Version: go1.15.1"}
{"level":"info","ts":1599572973.484769,"logger":"cmd","msg":"Go OS/Arch: darwin/amd64"}
{"level":"info","ts":1599572973.4847739,"logger":"cmd","msg":"Version of operator-sdk: v0.5.0"}
{"level":"info","ts":1599572973.4895291,"logger":"leader","msg":"Trying to become the leader."}
{"level":"info","ts":1599572973.4899452,"logger":"leader","msg":"Skipping leader election; not running in a cluster."}
{"level":"info","ts":1599572973.581069,"logger":"cmd","msg":"Registering Components."}
{"level":"info","ts":1599572973.5812979,"logger":"kubebuilder.controller","msg":"Starting EventSource","controller":"account-controller","source":"kind source: /, Kind="}
{"level":"info","ts":1599572973.581394,"logger":"kubebuilder.controller","msg":"Starting EventSource","controller":"accountclaim-controller","source":"kind source: /, Kind="}
{"level":"info","ts":1599572973.581434,"logger":"kubebuilder.controller","msg":"Starting EventSource","controller":"accountclaim-controller","source":"kind source: /, Kind="}
{"level":"info","ts":1599572973.5814679,"logger":"kubebuilder.controller","msg":"Starting EventSource","controller":"accountpool-controller","source":"kind source: /, Kind="}
{"level":"info","ts":1599572973.5814998,"logger":"kubebuilder.controller","msg":"Starting EventSource","controller":"accountpool-controller","source":"kind source: /, Kind="}
{"level":"info","ts":1599572973.5815349,"logger":"kubebuilder.controller","msg":"Starting EventSource","controller":"awsfederatedaccountaccess-controller","source":"kind source: /, Kind="}
{"level":"info","ts":1599572973.581586,"logger":"kubebuilder.controller","msg":"Starting EventSource","controller":"awsfederatedrole-controller","source":"kind source: /, Kind="}
{"level":"info","ts":1599572973.6449761,"logger":"aws-account-operator","msg":"Initializing the totalAccountWatcher"}

Και κάπως έτσι, ειδατε ενα real work scenario. Τωρα γιατι αντί να κατεβάσω το binary κάθησα και το έκανα compile; Ο μόνος λόγος που το έκανα αυτό είναι γιατί συμμετέχω και στο άλλο project, οπότε το είχα ήδη έτοιμο και ήξερα πράγματα γύρω από αυτό. Γενικά δεν χρειάζεται να το κάνετε, αλλά είμαστε open-source, οπότε ήδη βρήκα ένα bug στο documentation :D

3 «Μου αρέσει»