Skip to content

Latest commit

 

History

History
671 lines (552 loc) · 42.5 KB

File metadata and controls

671 lines (552 loc) · 42.5 KB

Гит и Перфорс

Перфорс је веома популаран систем за контролу верзија у корпоративним окружењима. На тржишту је од 1995. године што га чини најстаријим системом који је покривен овим поглављем. Као такав, дизајниран је са ограничењима која су важила тих дана; претпоставља да сте увек повезани на један централни сервер и на локалном диску се чува само једна верзија. Истини за вољу, његове могућности и ограничења су прилагођене неколицини специфичних проблема, али постоји много пројеката који користе Перфорс тамо где би Гит у суштини функционисао боље.

Постоје две опције ако желите да мешате употребу програма Перфорс и Гит. Прва коју ћемо представите је Git Fusion мост који праве творци програма Перфорс и који вам дозвољава да подстабла Перфорс депоа изложите као Гит репозиторијума по којима може да се чита и пише. Друга је git-p4, мост на клијентској страни који вам омогућава да програм Гит користите као Перфорс клијент, без потребе било какве реконфигурације Перфорс сервера.

Git Fusion

Перфорс нуди производ под називом Git Fusion (доступан на http://www.perforce.com/git-fusion), који са серверске стране синхронизује Перфорс сервер са Гит репозиторијумима.

Подешавање

У нашим примерима ћемо користи најлакшу методу инсталације програма Git Fusion, која представља преузимање виртуелне машине која извршава Перфорс даемон и Git Fusion. Слику виртуелне машине можете преузети са адресе http://www.perforce.com/downloads/Perforce/20-User, па када се преузимање заврши, увезете је у свој омиљени софтвер за виртуелизацију (овде ћемо користити VirtualBox).

Када по први пут покренете машину, питаће вас да подесите лозинку за три Линукс корисника (root, perforce, и git) и наведете име инстанце, које се користи да се та инсталација разликује од осталих на истој мрежи. Када се све то заврши, видећете следеће:

Екран при покретању _Git Fusion_ виртуелне машине
Figure 1. Екран при покретању Git Fusion виртуелне машине

Требало би да прибележите IP адресу која се овде прикаже, касније ћемо је користити. Затим ћемо да креирамо Перфорс корисника. Изаберите опцију „Login” на дну екрана и притисните ентер (или направите SSH везу са машином), и пријавите се као root. Затим употребите следеће команде да креирате корисника:

$ p4 -p localhost:1666 -u super user -f john
$ p4 -p localhost:1666 -u john passwd
$ exit

Прва команда ће покренути VI едитор да прилагодите корисника, али можете и прихватити подразумевана подешавања тако што откуцате :wq и притиснете ентер. Друга ће од вас захтевати да двапут унесете лозинку. То је све што је потребно да се уради у одзиву љуске, па напустите сесију.

Следећа ствар коју морате урадити је да програму Гит наложите да не проверава SSL сертификате. Git Fusion слика долази са сертификатом, али он је за домен који се не подудара са IP адресом ваше виртуелне машине, тако да ће програм Гит одбити да успостави HTTPS везу. Ако ће ово бити стална инсталација, консултујте Перфорс Git Fusion упутство да бисте инсталирали одговарајући сертификат; за наше потребе, следеће ће бити довољно:

$ export GIT_SSL_NO_VERIFY=true

Сада можете проверити да ли све ради како треба.

$ git clone https://10.0.1.254/Talkhouse
Cloning into 'Talkhouse'...
Username for 'https://10.0.1.254': john
Password for 'https://john@10.0.1.254':
remote: Counting objects: 630, done.
remote: Compressing objects: 100% (581/581), done.
remote: Total 630 (delta 172), reused 0 (delta 0)
Receiving objects: 100% (630/630), 1.22 MiB | 0 bytes/s, done.
Resolving deltas: 100% (172/172), done.
Checking connectivity... done.

Слика виртуелне машине долази опремљена са примером пројекта који можете да клонирате. Овде ћемо да клонирамо преко HTTPS, користећи john корисника којег смо управо креирали изнад; програм Git тражи акредитиве за ову везу, али ће нам кеш акредитива омогућити да онај корак прескочимо у наредним захтевима.

Fusion конфигурација

Када инсталирате програм Git Fusion, пожелећете да измените конфигурацију. Ово је у суштини прилично лако употребом вашег омиљеног Перфорс клијента; једноставно мапирајте //.git-fusion директоријум на Перфорс серверу у свој радни простор. Структура фајлова изгледа овако:

$ tree
.
├── objects
│   ├── repos
│   │   └── [...]
│   └── trees
│       └── [...]

├── p4gf_config
├── repos
│   └── Talkhouse
│       └── p4gf_config
└── users
    └── p4gf_usermap

498 directories, 287 files

Директоријум objects интерно користи програм Git Fusion да мапира Перфорс објекте у Гит и обрнуто, нема потребе да се тамо петљате са било чиме. У овом директоријуму постоји глобални p4gf_config фајл, као и по један са сваки репозиторијум – ово су конфигурациони фајлови који одређују како се програм Git Fusion понаша. Хајде да погледамо фајл у корену:

[repo-creation]
charset = utf8

[git-to-perforce]
change-owner = author
enable-git-branch-creation = yes
enable-swarm-reviews = yes
enable-git-merge-commits = yes
enable-git-submodules = yes
preflight-commit = none
ignore-author-permissions = no
read-permission-check = none
git-merge-avoidance-after-change-num = 12107

[perforce-to-git]
http-url = none
ssh-url = none

[@features]
imports = False
chunked-push = False
matrix2 = False
parallel-push = False

[authentication]
email-case-sensitivity = no

Овде нећемо улазити у значење ових заставица, али приметите да је ово само текстуални фајл у INI формату, сличан ономе који и програм Гит користи за конфигурацију. Овај фајл наводи глобалне опције које затим могу да се преиначе у конфигурационим фајловима одређеног репозиторијума, као што је repos/Talkhouse/p4gf_config. Ако отворите овај фајл, видећете [@repo] одељак са неким подешавањима која се разликују од глобалних подразумеваних. Такође чете видети и одељак који изгледа овако:

[Talkhouse-master]
git-branch-name = master
view = //depot/Talkhouse/main-dev/... ...

Ово је мапирање између Перфорс гране и Гит гране. Име одељка може бити произвољно, докле год је јединствено. git-branch-name вам омогућава да конвертујете путању депоа која би била незгодна за употребу у програму Гит на неко згодније име. Поставка view контролише како се Перфорс фајлови мапирају у Гит репозиторијум, користећи стандардну синтаксу мапирања погледа. Може да се наведе више од једног мапирања, као у следећем примеру:

[multi-project-mapping]
git-branch-name = master
view = //depot/project1/main/... project1/...
       //depot/project2/mainline/... project2/...

На овај начин, ако ваше уобичајено мапирање радног простора укључује измене структуре директоријума, то можете пресликати и у Гит репозиторијум.

Последњи фајл о коме ћемо причати је users/p4gf_usermap који мапира Перфорс кориснике на Гит кориснике и који вам можда никада неће бити ни потребан. Када се Перфорс скуп измена конвертује у Гит комит, подразумевано понашање програма Git Fusion је да потражи Перфорс корисника и употреби тамо сачувану имејл адресу и пуно име за поље аутор/комитер у програму Гит. Када се конвертује у другу страну, подразумевано се претражује Перфорс корисник са имејл адресом сачуваном у Гит пољу аутор комита, па се скуп измена подноси као тај корисник (уз примену дозвола). У већини случајева, ово понашање је сасвим у реду, али размотрите следећи фајл мапирања:

john john@example.com "John Doe"
john johnny@appleseed.net "John Doe"
bob employeeX@example.com "Anon X. Mouse"
joe employeeY@example.com "Anon Y. Mouse"

Свака линија је у формату <корисник> <имејл> "<пуно име>", и креира једно мапирање корисника. Прве две линије мапирају две различите имејл адресе у исти Перфорс кориснички налог. Ово је корисно ако сте креирали Гит комитове користећи неколико различитих имејл адреса (или променили имејл адресе), али желите да се све мапирају у истог Перфорс корисника. Када се из Перфорс скупа измена креира Гит комит, прва линија која се подудара са Перфорс корисником ће се употребити за Гит информације о ауторству комита.

Последње две линије маскирају стварна имена и имејл адресе Боба и Џоа у креираним Гит комитовима. Ово је лепо ако желите да отворите кôд неког интерног пројекта, али не желите да целом свету објавите свој директоријум запослених. Приметите да би имејл адресе и пуна имена требало да буду јединствени, осим ако не желите да се Гит комитови приписују једном фиктивном аутору.

Процес рада

Перфорс Git Fusion је двосмерни мост између Перфорс и Гит контроле верзија. Хајде да погледамо како изгледа рад са Гит стране. Претпоставићемо да смо мапирали „Jam” пројекат користећи конфигурациони фајл као што је показано изнад и који можемо да клонирамо на следећи начин:

$ git clone https://10.0.1.254/Jam
Cloning into 'Jam'...
Username for 'https://10.0.1.254': john
Password for 'https://ben@10.0.1.254':
remote: Counting objects: 2070, done.
remote: Compressing objects: 100% (1704/1704), done.
Receiving objects: 100% (2070/2070), 1.21 MiB | 0 bytes/s, done.
remote: Total 2070 (delta 1242), reused 0 (delta 0)
Resolving deltas: 100% (1242/1242), done.
Checking connectivity... done.
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/rel2.1
$ git log --oneline --decorate --graph --all
* 0a38c33 (origin/rel2.1) Create Jam 2.1 release branch.
| * d254865 (HEAD, origin/master, origin/HEAD, master) Upgrade to latest metrowerks on Beos -- the Intel one.
| * bd2f54a Put in fix for jam's NT handle leak.
| * c0f29e7 Fix URL in a jam doc
| * cc644ac Radstone's lynx port.
[...]

Када по први пут урадите ово, може да потраје. Оно што се дешава је да Git Fusion конвертује све примењиве скупове измена из Перфорс Историје у Гит комитове. Ово се ради локално на серверу, тако да је релативно брзо, али ако имате доста историје, ипак ће потрајати. Наредна преузимања врше инкременталну конверзију, тако да ће личити на природну Гит брзину.

Као што видите, наш репозиторијум изгледа потпуно исто као и било који други Гит репозиторијум са којим можете да радите. Постоје три гране, и Гит је лепо креирао локалну master грану која прати origin/master. Хајде да урадимо мало посла и креирамо неколико нових комитова:

# ...
$ git log --oneline --decorate --graph --all
* cfd46ab (HEAD, master) Add documentation for new feature
* a730d77 Whitespace
* d254865 (origin/master, origin/HEAD) Upgrade to latest metrowerks on Beos -- the Intel one.
* bd2f54a Put in fix for jam's NT handle leak.
[...]

Имамо два нова комита. Хајде сада да видимо да ли је још неко радио:

$ git fetch
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://10.0.1.254/Jam
   d254865..6afeb15  master     -> origin/master
$ git log --oneline --decorate --graph --all
* 6afeb15 (origin/master, origin/HEAD) Update copyright
| * cfd46ab (HEAD, master) Add documentation for new feature
| * a730d77 Whitespace
|/
* d254865 Upgrade to latest metrowerks on Beos -- the Intel one.
* bd2f54a Put in fix for jam's NT handle leak.
[...]

Изгледа да јесте! Не бисте то знали из овог погледа, али 6afeb15 је уствари креиран Перфорс клијентом. Изгледа као још један комит из перспективе програма Гит, што и јесте поента. Хајде да видимо како се Перфорс сервер носи са комитом спајања:

$ git merge origin/master
Auto-merging README
Merge made by the 'recursive' strategy.
 README | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git push
Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (9/9), 917 bytes | 0 bytes/s, done.
Total 9 (delta 6), reused 0 (delta 0)
remote: Perforce: 100% (3/3) Loading commit tree into memory...
remote: Perforce: 100% (5/5) Finding child commits...
remote: Perforce: Running git fast-export...
remote: Perforce: 100% (3/3) Checking commits...
remote: Processing will continue even if connection is closed.
remote: Perforce: 100% (3/3) Copying changelists...
remote: Perforce: Submitting new Git commit objects to Perforce: 4
To https://10.0.1.254/Jam
   6afeb15..89cba2b  master -> master

Програм Гит сматра да је све прошло успешно. Хајде да погледамо историју README фајла из перспективе програма Перфорс, користећи граф ревизија могућност команде p4v:

Перфорс граф ревизија као резултат извршења Гит команде push
Figure 2. Перфорс граф ревизија као резултат извршења Гит команде push

Ако овај поглед раније нисте видело, може вас донекле збунити, али он приказује исти концепт као и графички приказ Гит историје. Посматрамо историју README фајла, тако да стабло директоријума горе лево приказује само тај фајл како се појављује у разним гранама. Горе десно имамо визуелни граф веза између различитих ревизија, а доле десно приказ овог графа у целости. Остатак погледа приказује детаље изабране ревизије (у овом случају 2).

Једна ствар коју треба приметити је да граф изгледа потпуно исто као онај из Гит историје. Перфорс није имао именоване гране у које да смести комитове 1 и 2, па је креирао грану „anonymous” у .git-fusion директоријуму и сместио их у њу. Ово ђе се десити и именованим Гит гранама које не одговарају именованој Перфорс грани (а касније можете да их мапирате у Перфорс грану помоћу конфигурационог фајла).

Већина овога се догађа у позадини, али крајњи резултат је да једна особа у тиму може да користи Гит, друга може да користи Перфорс, а ниједна од њих неће знати шта је избор оне друге.

Git-Fusion резиме

Ако имате (или можете добити) приступ свом Перфорс серверу, Git Fusion је одличан начин да Гит и Перфорс разговарају међусобно. Потребно је мало конфигурисања, али крива учења није много стрма. Ово је један од малобројних одељака у овом поглављу где се упозорења о употреби пуне снаке програма Гит не појављују. Овим не желимо да кажемо како ће Перфорс бити срећан са свиме што му баците – ако покушате да поново испишете историју која је већ гурнута, Git Fusion ће одбити – али Git Fusion се заиста труди да осећај коришћења буде природан. Можете чак да користите и Гит подмодуле (који ће Перфорс корисницима изгледати чудно) и да спајате гране (ово ће са Перфорс стране бити забележено као интеграција).

Ако администратора свог сервера не можете убедити да постави Git Fusion, и даље постоји начин да ова два алата користите заједно.

Git-p4

Git-p4 је двосмерни мост између програма Гит и Перфорс. Потпуно се извршава у вашем Гит репозиторијуму, тако да вам не треба никакав приступ Перфорс серверу (осим корисничких акредитива, наравно). Git-p4 није тако флексибилно или комплетно решење као Git Fusion, али омогућава да урадите већину онога што бисте желели да урадите, а да не залазите у окружење сервера.

Note

Да бисте радили са git-p4, потребно је да негде на PATH имате алат p4. У време писања, он је слободно доступан на адреси http://www.perforce.com/downloads/Perforce/20-User.

Подешавање

У сврху примера, извршаваћемо Перфорс сервер из Git Fusion OVA (виртуелне машине) као што је приказано изнад, али ћемо прескочити Git Fusion сервер и директно прећи на Перфорс контролу верзија.

Да бисте користили p4 клијента из командне линије (од којег git-p4 зависи), потребно је да поставите неколико променљивих окружења:

$ export P4PORT=10.0.1.254:1666
$ export P4USER=john
Први кораци

Као што је и обичај у програму Гит, прва команда је клонирање:

$ git p4 clone //depot/www/live www-shallow
Importing from //depot/www/live into www-shallow
Initialized empty Git repository in /private/tmp/www-shallow/.git/
Doing initial import of //depot/www/live/ from revision #head into refs/remotes/p4/master

Ово креира оно што се у Гит терминологији назива „shallow” (плитки) клон; у Гит се увози само најновија Перфорс ревизија; упамтите, програм Перфорс није дизајниран тако да сваком кориснику достави сваку ревизију. Ово је довољно да се програм Гит користи као Перфорс клијент, али за остале сврхе није довољно.

Када се заврши, имамо потпуно функционални Гит репозиторијум:

$ cd myproject
$ git log --oneline --all --graph --decorate
* 70eaf78 (HEAD, p4/master, p4/HEAD, master) Initial import of //depot/www/live/ from the state at revision #head

Приметите да за Перфорс сервер постоји „p4” удаљени репозиторијум, али све остало изгледа као стандардни клон. То уствари и није тачно, јер тамо заправо нема никаквог удаљеног репозиторијума.

$ git remote -v

У овом репозиторијуму нема ниједног удаљеног репозиторијума. Git-p4 је креирао неке референце које представљају стање сервера и команди git log оне изгледају као удаљене референце, али њима не управља сам програм Гит и не можете да гурнете на њих.

Процес рада

У реду, хајде да одрадимо неки посао. Претпоставимо да сте постигли неки напредак на веома важној могућности и спремни сте да их покажете остатку свог тима.

$ git log --oneline --all --graph --decorate
* 018467c (HEAD, master) Change page title
* c0fb617 Update link
* 70eaf78 (p4/master, p4/HEAD) Initial import of //depot/www/live/ from the state at revision #head

Направили смо два нова комита које желимо да проследимо Перфорс серверу. Хајде да проверимо да ли је још неко радио данас:

$ git p4 sync
git p4 sync
Performing incremental import into refs/remotes/p4/master git branch
Depot paths: //depot/www/live/
Import destination: refs/remotes/p4/master
Importing revision 12142 (100%)
$ git log --oneline --all --graph --decorate
* 75cd059 (p4/master, p4/HEAD) Update copyright
| * 018467c (HEAD, master) Change page title
| * c0fb617 Update link
|/
* 70eaf78 Initial import of //depot/www/live/ from the state at revision #head

Изгледа као да се се измене и master и p4/master разишли. Систем грана програма Перфорс уопште не личи на систем програма Гит, тако да достављање комитова спајања нема никаквог смисла. Git-p4 препоручује да ребазирате своје комитове, па чак обезбеђује и пречицу за то:

$ git p4 rebase
Performing incremental import into refs/remotes/p4/master git branch
Depot paths: //depot/www/live/
No changes to import!
Rebasing the current branch onto remotes/p4/master
First, rewinding head to replay your work on top of it...
Applying: Update link
Applying: Change page title
 index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Вероватно можете видети у излазу, git p4 rebase је пречица за git p4 sync иза које следи git rebase p4/master. У суштини је мало паметније од тога, посебно када се ради са више грана, али ово је добра апроксимација.

Сада је наша историја поново линеарна, па смо спремни да измене допринесемо назад на Перфорс. Команда git p4 submit ће покушати да креира нову Перфорс ревизију за сваки Гит комит између p4/master и master. Када је покренете прелазите у свој омиљени едитор и садржај фајла који вам се приказује изгледа отприлике овако:

# A Perforce Change Specification.
#
#  Change:      The change number. 'new' on a new changelist.
#  Date:        The date this specification was last modified.
#  Client:      The client on which the changelist was created.  Read-only.
#  User:        The user who created the changelist.
#  Status:      Either 'pending' or 'submitted'. Read-only.
#  Type:        Either 'public' or 'restricted'. Default is 'public'.
#  Description: Comments about the changelist.  Required.
#  Jobs:        What opened jobs are to be closed by this changelist.
#               You may delete jobs from this list.  (New changelists only.)
#  Files:       What opened files from the default changelist are to be added
#               to this changelist.  You may delete files from this list.
#               (New changelists only.)

Change:  new

Client:  john_bens-mbp_8487

User: john

Status:  new

Description:
   Update link

Files:
   //depot/www/live/index.html   # edit


######## git author ben@straub.cc does not match your p4 account.
######## Use option --preserve-user to modify authorship.
######## Variable git-p4.skipUserNameCheck hides this message.
######## everything below this line is just the diff #######
--- //depot/www/live/index.html  2014-08-31 18:26:05.000000000 0000
+++ /Users/ben/john_bens-mbp_8487/john_bens-mbp_8487/depot/www/live/index.html   2014-08-31 18:26:05.000000000 0000
@@ -60,7 +60,7 @@
 </td>
 <td valign=top>
 Source and documentation for
-<a href="http://www.perforce.com/jam/jam.html">
+<a href="jam.html">
 Jam/MR</a>,
 a software build tool.
 </td>

Ово је углавном исти садржај који бисте видели и да извршите p4 submit, осим дела на крају који је git-p4 згодно убацио. Када треба да достави име за комит или скуп измена Git-p4 покушава да поштује појединачно ваша Гит и Перфорс подешавања, али у неким случајевима бисте то пожелели да преиначите. На пример, ако је Гит комит који увозите написао сарадник који нема Перфорс кориснички налог, ипак желите да крајњи скуп измена изгледа тако да га је написала та особа (а не ви).

Git-p4 је корисно увезао поруку из Гит комита као садржај овог Перфорс скупа измена, па све што је потребно да се уради јесте да фајл сачувамо и напустимо едитор, двапут (по једном за сваки комит). Коначни излаз у љуски ће изгледати слично следћем:

$ git p4 submit
Perforce checkout for depot path //depot/www/live/ located at /Users/ben/john_bens-mbp_8487/john_bens-mbp_8487/depot/www/live/
Synchronizing p4 checkout...
... - file(s) up-to-date.
Applying dbac45b Update link
//depot/www/live/index.html#4 - opened for edit
Change 12143 created with 1 open file(s).
Submitting change 12143.
Locking 1 files ...
edit //depot/www/live/index.html#5
Change 12143 submitted.
Applying 905ec6a Change page title
//depot/www/live/index.html#5 - opened for edit
Change 12144 created with 1 open file(s).
Submitting change 12144.
Locking 1 files ...
edit //depot/www/live/index.html#6
Change 12144 submitted.
All commits applied!
Performing incremental import into refs/remotes/p4/master git branch
Depot paths: //depot/www/live/
Import destination: refs/remotes/p4/master
Importing revision 12144 (100%)
Rebasing the current branch onto remotes/p4/master
First, rewinding head to replay your work on top of it...
$ git log --oneline --all --graph --decorate
* 775a46f (HEAD, p4/master, p4/HEAD, master) Change page title
* 05f1ade Update link
* 75cd059 Update copyright
* 70eaf78 Initial import of //depot/www/live/ from the state at revision #head

Резултат је исти као да смо само извршили git push, што и јесте најприближнија аналогија ономе што се заиста одиграло.

Приметите да се током овог процеса сваки Гит комит претворио у Перфорс скуп измена; ако желите да их згњечите у један једини скуп измена, урадите то интерактивним ребазирањем пре него што извршите git p4 submit. Такође приметите да су се SHA-1 хешеви свих комитова који су достављени као скупови измена променили; то је зато што git-p4 додаје линију на крај сваког комита који конвертује:

$ git log -1
commit 775a46f630d8b46535fc9983cf3ebe6b9aa53145
Author: John Doe <john@example.com>
Date:   Sun Aug 31 10:31:44 2014 -0800

    Change page title

    [git-p4: depot-paths = "//depot/www/live/": change = 12144]

Шта се дешава ако покушате да доставите комит спајања? Хајде да пробамо. Ево ситуације у којој смо се нашли:

$ git log --oneline --all --graph --decorate
* 3be6fd8 (HEAD, master) Correct email address
*   1dcbf21 Merge remote-tracking branch 'p4/master'
|\
| * c4689fc (p4/master, p4/HEAD) Grammar fix
* | cbacd0a Table borders: yes please
* | b4959b6 Trademark
|/
* 775a46f Change page title
* 05f1ade Update link
* 75cd059 Update copyright
* 70eaf78 Initial import of //depot/www/live/ from the state at revision #head

Гит и Перфорс историје су се разишле након 775a46f. Гит страна има два комита, па затим комит спајања са Перфорс главом, затим још један комит. Покушаћемо да их доставимо као један једини скуп измена на Перфорс страну. Хајде да видимо шта би се догодило ако сада покушамо да доставимо:

$ git p4 submit -n
Perforce checkout for depot path //depot/www/live/ located at /Users/ben/john_bens-mbp_8487/john_bens-mbp_8487/depot/www/live/
Would synchronize p4 checkout in /Users/ben/john_bens-mbp_8487/john_bens-mbp_8487/depot/www/live/
Would apply
  b4959b6 Trademark
  cbacd0a Table borders: yes please
  3be6fd8 Correct email address

Заставица -n је скраћеница за --dry-run, а то покушава да извести шта би се догодило ако би се команда достављања заиста извршила. У овом случају изгледа да би се креирала три Перфорс скупа измена, што се подудара са три комитова који нису спајање и који још увек не постоје на Перфорс серверу. То звучи управо као оно што желимо, па хајде да видимо како ће да испадне:

$ git p4 submit
[…]
$ git log --oneline --all --graph --decorate
* dadbd89 (HEAD, p4/master, p4/HEAD, master) Correct email address
* 1b79a80 Table borders: yes please
* 0097235 Trademark
* c4689fc Grammar fix
* 775a46f Change page title
* 05f1ade Update link
* 75cd059 Update copyright
* 70eaf78 Initial import of //depot/www/live/ from the state at revision #head

Наша историја је постала линеарна, као да смо је ребазирали пре подношења (што се у суштини заиста и десило). Ово значи да на Гит страни слободно можете да креирате гране, радите на њима, бришете их и спајате без страха да ће ваша историја на неки начин постати некомпатибилна са програмом Перфорс. Ако можете да је ребазирате, можете и да је пошаљете на Перфорс сервер.

Гранање

Ако ваш Перфорс пројекат има више грана, ипак имате среће; git-p4 то може да обради на начин да којим се чини као да је природно у програму Гит. Рецимо да је ваш Перфорс депо постављен на следећи начин:

//depot
  └── project
      ├── main
      └── dev

И рецимо да имате dev грану која поседује следећу спецификацију погледа:

//depot/project/main/... //depot/project/dev/...

Git-p4 може аутоматски да детектује такву ситуацију и уради одговарајућу ствар:

$ git p4 clone --detect-branches //depot/project@all
Importing from //depot/project@all into project
Initialized empty Git repository in /private/tmp/project/.git/
Importing revision 20 (50%)
    Importing new branch project/dev

    Resuming with change 20
Importing revision 22 (100%)
Updated branches: main dev
$ cd project; git log --oneline --all --graph --decorate
* eae77ae (HEAD, p4/master, p4/HEAD, master) main
| * 10d55fb (p4/project/dev) dev
| * a43cfae Populate //depot/project/main/... //depot/project/dev/....
|/
* 2b83451 Project init

Приметите спецификатор „@all” у путањи депоа; он говори git-p4 да клонира не само последњи скуп измена за то подстабло, већ и све скупове измена које су икада дотакле те путање. То је приближније концепту клонирања у програму Гит, али ако радите на пројекту са дугачком историјом, могло би да потраје.

Заставица --detect-branches налаже да git-p4 искористи Перфорс спецификације гране за мапирање грана у Гит референце. Ако се ова мапирања не налазе на Перфорс серверу (што је савршено исправан начин да се користи Перфорс), можете сами навести git-p4 мапирања грана, па добијате исти резултат:

$ git init project
Initialized empty Git repository in /tmp/project/.git/
$ cd project
$ git config git-p4.branchList main:dev
$ git clone --detect-branches //depot/project@all .

Постављање git-p4.branchList конфигурационе променљиве на main:dev говори команди git-p4 да су и „main” и „dev” гране, као и да је друга дете прве.

Ако сада извршимо git checkout -b dev p4/project/dev и направимо неколико комитова, git-p4 је довољно паметна да циља на праву грану када извршимо git p4 submit. Нажалост, git-p4 не може да меша плитке клонове и вишеструке гране; ако имате огроман пројекат и желите да радите на више од једне гране, мораћете да извршите git p4 clone по једном за сваку грану на коју желите да достављате измене.

За креирање или интегрисање грана мораћете да користите Перфорс клијент. Git-p4 може само да синхронизује и доставља на постојеће гране и то само као један линеарни скуп измена одједном. Ако у програму Гит спојите две гране и покушате да доставите нови скуп измена, све што ће се забележити биће гомила измена над фајловима; изгубиће се сви метаподаци о гранама које су умешане у интеграцију.

Гит и Перфорс резиме

Git-p4 омогућава да се са Перфорс сервером употребљава Гит процес рада, и прилично је добра у томе. Међутим, важно је упамтити да је Перфорс управља изворним кодом, а ви програм Гит користите само за рад у локалу. Само будите врло пажљиви са дељењем Гит комитова; ако имате удаљени репозиторијум који користе и други људи, не гурајте било које комитове који већ нису достављени Перфорс серверу.

Ако желите да слободно мешате упторебу програма Перфорс и програма Гит као клијената за контролу изворног кода, а администратора сервера можете убедити да га инсталира, Git Fusion чини да Гит постане првокласни клијент Перфорс сервера за контролу верзија.