Git
Chapters ▾ 2nd Edition

7.12 Git Алатки - Збивање

Збивање

Иако ние ги опфаќаме општите начини за пренос на Git податоци преку мрежа (HTTP, SSH, итн), всушност постои уште еден начин да се направи тоа што не се користи вообичаено, но всушност може да биде доста корисно.

Git е способен да ги "збие" своите податоци во една датотека. Ова може да биде корисно во различни сценарија. Можеби вашата мрежа е долу и сакате да испратите промени на вашите соработници. Можеби работите некаде надвор од локацијата и немате пристап до локалната мрежа поради безбедносни причини. Можеби вашата безжична / етернет картичка едноставно се скрши. Можеби немате пристап до заеднички сервер за момент, сакате да испраќате е-пошта на некој ажурирање и не сакате да префрлите 40 обврски преку формат-печ.

Ова е местото каде командата git bundle може да биде корисна. Командата bundle ќе го спакува сето она што вообичаено ќе се турка преку жицата со командата` git push` во бинарна датотека која може да му ја испратите на некој или да ставите флеш диск, а потоа да се оддели во друго складиште.

Ајде да видиме едноставен пример. Да речеме дека имате репозиториум со две обврски:

$ 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

Ако сакате да го испратите тоа складиште на некого и немате пристап до складиштето за да притиснете, или едноставно не сакате да го поставите едно, можете да го вклучите со 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)

Сега имате датотека со име repo.bundle која ги има сите податоци потребни за повторно креирање на` господар` филијала на складиштето на складиштето. Со командата bundle треба да ја наведете секоја референца или одреден опсег на обврски кои сакате да ги вклучите. Ако имате намера ова да биде клонирано некаде на друго место, треба да додадете HEAD како референца, како и тука.

Можете да ја испратите оваа датотека repo.bundle на некој друг, или да ја ставите на USB-уред и да ја преместите.

Од друга страна, велат дека сте испратени оваа датотека repo.bundle и сакате да работите на проектот. Можете да клонирате од бинарната датотека во директориумот, слично како и вие од URL-то.

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

Ако не ги вклучувате HEAD во референци, исто така мора да наведете "-b master" или која било гранка е вклучена, бидејќи во спротивно нема да знае која гранка да се провери.

Сега да речеме да направите три обврски на неа и сакате да го испратите новиот обврзува назад преку пакет на USB стик или е-пошта.

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

Прво треба да го одредиме опсегот на обврските што сакаме да ги вклучиме во пакетот. За разлика од мрежните протоколи кои го одредуваат минималниот сет на податоци за пренос преку мрежа за нас, ние ќе треба да го разгледаме ова рачно.   Сега, можете едноставно да го сторите истото и да го вклучите целото складиште кое ќе работи, но подобро е само да ја разделите разликата - само трите обврски што ги направивме само на локално ниво.

За да го направите тоа, ќе треба да ја пресметате разликата. Како што е опишано во << _commit_ranges >>, можете да наведете голем број на обврски на повеќе начини. За да ги добиеме трите обврски што ги имаме во нашата господарска гранка, кои не беа во гранката, ние првично клониравме, може да користиме нешто како "потекло / господар .. мастер" или "господар ^ потекло / господар". Можете да го тестирате тоа со командата log.

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

Па сега кога имаме листа на обврски кои сакаме да ги вклучиме во пакетот, да ги вклучиме. Ние го правиме тоа со командата git bundle create, давајќи го името на датотеката за која сакаме да биде нашиот пакет и опсегот на обврските што сакаме да ги внесеме.

$ 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)

Сега имаме датотека commits.bundle во нашиот директориум. Ако го земеме тоа и го испратиме на нашиот партнер, таа може да го увезе во оригиналното складиште, дури и ако во меѓувреме има направено повеќе работа.

Кога ќе го добие пакетот, таа може да го испита тоа за да види што содржи, пред да го внесе во нејзиното складиште. Првата команда е командата bundle verify која ќе осигури дека датотеката всушност е валиден пакет на Git и дека ги имате сите потребни предци за правилно да го реконструирате.

$ 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

Доколку пакетот создаде пакет на само последните две обврски што ги направиле, наместо сите три, оригиналното складиште нема да може да го увезе, бидејќи му недостасува потребната историја. Командата verify би изгледала вака:

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

Сепак, нашиот прв пакет е валиден, за да можеме да превземеме обврски од него. Ако сакате да видите кои гранки се наоѓаат во пакетот што може да се увезуваат, исто така постои и команда која само ги набројува главите:

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

Под-командата потврди ќе ви ги каже и главите. Поентата е да се види што може да се влече, така што можете да ги користите командите fetch или` pull` за да увезете обврски од овој пакет. Овде ќе ја донесиме "господар" гранката на пакетот до филијала со име "друг господар" во нашето складиште:

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

Сега можеме да видиме дека имаме увозни обврски на гранката "друг господар", како и какви било обврски што сме ги направиле во меѓувреме во нашата "master" гранка.

$ 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

Значи, git bundle може да биде навистина корисно за споделување или вршење мрежни операции кога немате соодветна мрежа или споделено складиште за да го направите тоа.