Git
Chapters ▾ 2nd Edition

7.12 Mga Git na Kasangkapan - Pagbibigkis

Pagbibigkis

Kahit na tinalakay natin ang pangkaraniwang paraan sa paglipat sa Git na datos gamit ang network (HTTP, SSH, etc), mayroon talagang isa pang paraan upang gawin iyon na hindi karaniwang ginamit ngunit maaaring talagang maging kapaki-pakinabang.

Ang Git ay may kakayahan sa “pagbibigkis” sa datos nito sa isang solong file. Ito may maaaring magagamit sa iba’t ibang sitwasyon. Baka ang iyong network ay nasira at gusto mo na pagpasa ng mga pagbabago sa iyong mga katrabaho. Marahil ikaw ay nagtatrabaho na kung saang offsite at wala kang pahintulot sa lokal na network para sa mga rason sa seguridad. Baka ang iyong wireless/ethernet na card ay nasira lamang. Baka ikaw ay walang pahintulot sa isang ibinahagi na server sa pagkakataon na ito, gusto mong mag-email sa ibang taong update at hindi mo gusto ang maglipat ng 40 na mga commit gamit ang format-patch.

Ito ay kung saan ang git bundle na utos ay maaaring makatulong. Ang bundle na utos ay nagbubugkos ng lahat na karaniwang na push sa wire na may isang git push na ubos sa isang binary na file na maaari kang mag-email sa kung sino o maglagay sa flash drive, pagkatapos ay i-unbundle sa isa pang repositoryo.

Tingnan natin ang isang simpleng halimbawa. Sabihin natin na meron kang isang repositoryo na may dalawang commit:

$ git log
commit 9a466c572fe88b195efd356c3f2bbeccdb504102
Author: Scott Chacon <schacon@gmail.com>
Date:   Wed Mar 10 07:34:10 2010 -0800

    second commit

commit b1ec3248f39900d2a406049d762aa68e9641be25
Author: Scott Chacon <schacon@gmail.com>
Date:   Wed Mar 10 07:34:01 2010 -0800

    first commit

Kung gusto mong magpadala sa repositoryong iyon sa ibang tao at wala kay pahintulot sa isang repositoryo na mag-push, o hindi mo gusto ang mag-setup ng isa, maaari kang magbugkos nito gamit ang git bundle create.

$ git bundle create repo.bundle HEAD master
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 441 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)

Mayroon ka na ngayong isang file na tinatawag na repo.bundle na merong lahat ng datos na kinakailangan mo maggawa muli ang master na branch ng repositoryo. Kasama ang bundle na utos na kailangan mo sa iyong listahan sa bawat reperensiya o tiyak na layo sa mga commit na gusto mong isama. Kung ang nilayon mo dito ay maka-clone ng kung saan, kailangan mong magdagdag ng add HEAD bilang isang reperensiya pati na rin ang nagawa namin dito.

Maaari mong i-email itong repo.bundle na file sa kung sino, o ilagay ito sa USB drive at lakarin ito.

Sa kabilang panig, sabihin natin na ikaw ay nakapagpadala nitong repo.bundle na file at gusto mong magtrabaho sa proyekto. Maaari mong i-clone mula sa binary na file sa isang direktoryo, na mas gusto mo mula sa iyong URL.

$ git clone repo.bundle repo
Cloning into 'repo'...
...
$ cd repo
$ git log --oneline
9a466c5 second commit
b1ec324 first commit

Kung hindi mo isali ang HEAD sa mga reperensiya, kailangan mo ding tukuyin ang -b master o anumang branch na kasali na kung dahil, hindi nito malalaman kung anong branch ang titingnan.

Ngayon sabihin natin sayo na mayroon kang tatlong mga commit dito at gusto mong magpadala ng bagong mga commit sa pamamagitan ng bugkos sa isang USB stick o email.

$ git log --oneline
71b84da last commit - second repo
c99cf5b fourth commit - second repo
7011d3d third commit - second repo
9a466c5 second commit
b1ec324 first commit

Una kailangan nating matukoy ang layo ng mga commit na gusto nating isali sa bugkos. Di tulad sa ibang mga network protocol na kung saan ang tinitingnan ang pinakababang itinakda na datos na ipapadala sa network para sa atin, kailangan nating malaman ng manu-mano. Ngayon, maaari kang makagawa nang parehong bagay at pagbugkos sa buong repositoryo, na kung saan ay gagana, ngunit ito ay mas mahusay na i-bugkos ang kaibahan - tatlo lamang na mga commit ang aming ginawa sa lokal.

Upang magawa iyon, kailangan mong kalkulahin ang kanilang pagkakaiba. Tulad ng inilalarawan namin sa Mga Lawak ng Commit, maaari kang magtukoy ng lawak ng mga commit sa bilang ng mga paraan. Para kumuha ng tatlong mga commit na meron tayo sa ating master branch ay orihinal tayong mag-clone, maaari tayong gumamit ng anuman tulad ng origin/master..master o master ^origin/master. Maaari kang subukan ito gamit ang log na utos.

$ git log --oneline master ^origin/master
71b84da last commit - second repo
c99cf5b fourth commit - second repo
7011d3d third commit - second repo

Sa ngayon meron na tayong listahan sa mga commit na gusto nating isali sa bugkos, kaya ibugkos na natin sila. Ginagawa natin ito sa pamamagitan ng git bundle create na utos, magbigay ka ng isang filename na gusto mong ibugkos at ang lawak ng mga commit na gusto nating puntahan.

$ git bundle create commits.bundle master ^9a466c5
Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (9/9), 775 bytes, done.
Total 9 (delta 0), reused 0 (delta 0)

Ngayon meron na tayong isang commits.bundle na file sa ating direktoryo. Kung kunin natin ito at ipadala sa ating katuwang, siya at maaaring maka-import sa orihinal na repositoryo, kahit na mas maraming trabaho ang dapat na gagawin sa pansamantala.

Kapag ito ay na bugkos, siya at maaaring makasiyasat at tumigin sa anong mga nilalaman bago siya mag-import sa kanyang repositoryo. Ang unang utos ay ang bundle verify na utos na nagtitiyak sa file na balido sa bugkos ng Git at meron kang kinakailangan na mga ninuno na i-reconstitute ng maayos.

$ git bundle verify ../commits.bundle
The bundle contains 1 ref
71b84daaf49abed142a373b6e5c59a22dc6560dc refs/heads/master
The bundle requires these 1 ref
9a466c572fe88b195efd356c3f2bbeccdb504102 second commit
../commits.bundle is okay

Kung ang bugkos ay naggawa ang pagbukos sa huling dalawang mga commit lamang, sa halip na tatlo lahat, ang orihinal na repositoryo ay hindi maka import, dahil nawawala ang kinakailangang kasaysayan. Ang verify na utos ay mukhang ganito sa halip:

$ git bundle verify ../commits-bad.bundle
error: Repository lacks these prerequisite commits:
error: 7011d3d8fc200abe0ad561c011c3852a4b7bbe95 third commit - second repo

Gayunpaman, ang aming unang bugkos ay balido, kaya makukuha natin ang mga commit mula dito. Kung gusto mong tingnan ang mga branch na nasa bugkos ay pwedeng ma import, meron ding ibang mga utos na naglilista sa mga head:

$ git bundle list-heads ../commits.bundle
71b84daaf49abed142a373b6e5c59a22dc6560dc refs/heads/master

Ang verify na ibabang utos ay nagsasabi sayo sa mga head din. Ang punto ay upang makita kung ano ang maaaring makuha, kaya maaari mong gamitin ang fetch o pull na mga utos upang i-import ang mga comit mula sa bugkos na ito. Narito kami at kukuha ng master na branch sa bugkos sa isang branch na nagngangalang other-master sa ating repositoryo:

$ git fetch ../commits.bundle master:other-master
From ../commits.bundle
 * [new branch]      master     -> other-master

Ngayon ay makikita natin na meron tayong mga na-import na mga commit sa other-master na branch pati na rin ang mga commit na nagawa sa pansamantala sa aming sarili.

$ git log --oneline --decorate --graph --all
* 8255d41 (HEAD, master) third commit - first repo
| * 71b84da (other-master) last commit - second repo
| * c99cf5b fourth commit - second repo
| * 7011d3d third commit - second repo
|/
* 9a466c5 second commit
* b1ec324 first commit

Kaya, ang git bundle ay maaaring talagang kapaki-pakinabang para mabahagi o gimagawa na network-uri na mga operasyon kapag wala kang tamang network o nabahaging repostoryo na gawin ito.