Umbutho wofikelelo lwabasebenzisi abaninzi kwiseva ye-GIT

Xa ufaka kwaye uqwalasela iseva ye-Git, umbuzo uvela malunga nokulungelelanisa ukufikelela kubasebenzisi abaninzi kwiiprojekthi ezininzi. Ndiphande umba kwaye ndafumana isisombululo esihlangabezana nazo zonke iimfuno zam: elula, ekhuselekileyo, ethembekileyo.

Iminqweno yam yile:

  • umsebenzisi ngamnye uqhagamshela neakhawunti yakhe
  • Abasebenzisi abaninzi banokusebenza kwiprojekthi enye
  • umsebenzisi omnye unokusebenza kwiiprojekthi ezininzi
  • umsebenzisi ngamnye unokufikelela kuphela kwezo projekthi asebenza kuzo
  • Kumele ukuba kwenzeke ukuqhagamshela ngelayini yomyalelo, kwaye kungekhona nje ngolunye uhlobo lojongano lwewebhu

Kuya kuba kuhle kwakhona:

  • nika iimvume zokufunda kuphela kubantu abalawulayo
  • Ukulawula ngokufanelekileyo amalungelo okufikelela kumsebenzisi kwi-Git

Isishwankathelo seenketho ezinokwenzeka zokufikelela kwiseva ye-GIT

Okokuqala, kufuneka wazi ukuba ungakhetha ntoni, ke nantsi imbono ekhawulezayo yeeprothokholi zeGit.

  • ssh - iakhawunti yomsebenzisi eyenziwe ngokukodwa isetyenziselwa ukufikelela kumncedisi.
    • Kuyamangalisa ukuba i-Git ayibandakanyi kwiingcebiso zayo zokusetyenziswa kweakhawunti enye ukufikelela kuzo zonke iindawo zokugcina. Oku akuhlangabezani neemfuno zam kwaphela.
    • Ungasebenzisa iiakhawunti ezininzi, kodwa unganciphisa njani ukufikelela komsebenzisi kubalawuli abathile kuphela?
      • Ukuvala kwi-directory yasekhaya akufanelekanga, kuba kunzima ukucwangcisa ukufikelela kokubhala apho kwabanye abasebenzisi
      • Ukusebenzisa ii-symlink kuluhlu lwakho lwasekhaya kukwanzima kuba i-Git ayitoliki njengamakhonkco
      • Kunokwenzeka ukukhawulela ukufikelela kwitoliki, kodwa akukho siqinisekiso esipheleleyo sokuba iya kuhlala isebenza
        • Ungaqhagamshela ngokubanzi itoliki yomyalelo wakho kubasebenzisi abanjalo, kodwa
          • okokuqala, olu sele luhlobo oluthile lwesigqibo esinzima,
          • kwaye okwesibini, oku kunokuthintelwa.

    Kodwa mhlawumbi akuyongxaki ukuba umsebenzisi uya kukwazi ukuphumeza nayiphi na imiyalelo? Siza kubuyela kule ndlela kamva, kodwa ngoku siza kuqwalasela ngokufutshane ezinye iindlela, mhlawumbi kuya kubakho into elula.

  • Iprotocol yendawo yegit ingasetyenziswa ngokudityaniswa neesshfs, abasebenzisi abaninzi banokusetyenziswa, kodwa ngokusisiseko iyafana nemeko yangaphambili.
  • http - funda-kuphela
  • I-git ifundwa kuphela
  • https - kunzima ukuyifaka, udinga isofthiwe eyongezelelweyo, uhlobo oluthile lwephaneli yokulawula ukucwangcisa ukufikelela komsebenzisi ... kubonakala kungenakwenzeka, kodwa ngandlela-thile yonke into inzima.

Ukusebenzisa iprotocol ye-ssh ukucwangcisa ufikelelo lwabasebenzisi abaninzi kumncedisi weGit

Masibuyele kwiprotocol ye-ssh.

Ekubeni usebenzisa ukufikelela kwe-ssh kwi-git, kufuneka uqinisekise ukhuseleko lwedatha yeseva. Umsebenzisi oqhagamshela nge ssh usebenzisa igama lakhe lokungena kumncedisi we Linux, ngoko ke banokuqhagamshela ngomxhasi we-ssh kwaye bafikelele kumgca womyalelo womncedisi.
Akukho khuseleko lupheleleyo malunga nokufikelela okunjalo.

Kodwa umsebenzisi akufuneki abe nomdla kwiifayile zeLinux. Ulwazi olubalulekileyo lugcinwa kuphela kwindawo yokugcina igit. Ke ngoko, kunokwenzeka ukuba ungathinteli ukufikelela ngomgca womyalelo, kodwa usebenzisa izixhobo zeLinux ukunqanda umsebenzisi ekujongeni iiprojekthi, ngaphandle kwezo athatha inxaxheba kuzo.
Ukhetho olucacileyo kukusebenzisa inkqubo yeemvume zeLinux.

Njengoko sele kukhankanyiwe, kuyenzeka ukuba usebenzise iakhawunti enye kuphela ukufikelela kwi-ssh. Olu lungelelwaniso alukhuselekanga kubasebenzisi abaninzi, nangona lubandakanyiwe kuluhlu lweenketho ezicetyiswayo zegit.

Ukuphumeza iimfuno ezinikwe ekuqaleni kwenqaku, ulwakhiwo lolawulo olulandelayo lwenziwa kunye nokunikezelwa kwamalungelo kunye nabanini:

1) abalawuli beeprojekthi

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
apho
I-dir1, i-dir2, i-dir3-izalathiso zeprojekthi: iprojekthi 1, iprojekthi 2, iprojekthi 3.

proj1:proj1, proj2:proj2, proj3:proj3 ziyilwe ngokukodwa abasebenzisi beLinux ababelwe njengabanini babalawuli beeprojekthi ezihambelanayo.

iimvume zabo bonke abalawuli zimiselwe ku-0770-ufikelelo olupheleleyo lomnini kunye neqela lakhe kunye nokuvalwa ngokupheleleyo komntu wonke.

2) iiakhawunti zomphuhlisi

Разработчик 1: dev1:dev1,proj1,proj2
Разработчик 2: dev2:dev2,proj2,proj3

Inqaku eliphambili kukuba abaphuhlisi babelwa iqela elongezelelweyo lomnini wenkqubo yomsebenzisi weprojekthi ehambelanayo. Oku kwenziwa ngumlawuli womncedisi we Linux ngomyalelo omnye.

Kulo mzekelo, "uMphuhlisi 1" usebenza kwiiprojekthi zeproj1 kunye neproj2, kwaye "uMphuhlisi 2" usebenza kwiiprojekthi zeproj2 kunye neproj3.

Ukuba nabaphi na abaPhuhlisi baqhagamshela nge-ssh ngomgca womyalelo, ngoko ke amalungelo abo akayi kukwanela nokujonga imixholo yolawulo lweeprojekthi abangathabathi nxaxheba kuzo. Akanakukwazi ukuyitshintsha ngokwakhe le nto.

Ekubeni isiseko salo mgaqo lukhuseleko olusisiseko lwamalungelo e-Linux, esi sikimu sithembekile. Ukongeza, iskimu kulula kakhulu ukulawula.

Masiqhubele phambili siziqhelanise.

Ukwenza iindawo zokugcina zeGit kwiseva yeLinux

Siyajonga.

[root@server ~]# cd /var/
[root@server var]# useradd gitowner
[root@server var]# mkdir gitservertest
[root@server var]# chown gitowner:gitowner gitservertest
[root@server var]# adduser proj1
[root@server var]# adduser proj2
[root@server var]# adduser proj3
[root@server var]# adduser dev1
[root@server var]# adduser dev2
[root@server var]# passwd dev1
[root@server var]# passwd dev2

Ndidiniwe kukuchwetheza ngesandla...

[root@server gitservertest]# sed "s/ /n/g" <<< "proj1 proj2 proj3" | while read u; do mkdir $u; chown $u:$u $u; chmod 0770 $u; done

[root@server gitservertest]# usermod -aG proj1 dev1
[root@server gitservertest]# usermod -aG proj2 dev1
[root@server gitservertest]# usermod -aG proj2 dev2
[root@server gitservertest]# usermod -aG proj3 dev2

Siqinisekile ukuba akunakwenzeka ukufikelela kwiindawo zokugcina zabanye abantu ukusuka kumgca womyalelo kunye nokujonga imixholo yazo.

[dev1@server ~]$ cd /var/gitservertest/proj3
-bash: cd: /var/gitservertest/proj3: Permission denied
[dev1@server ~]$ ls /var/gitservertest/proj3
ls: cannot open directory /var/gitservertest/proj3: Permission denied

Sebenzisana nabaphuhlisi abaninzi kwiprojekthi enye kwiGit

Omnye umbuzo uhlala, ukuba omnye umthuthukisi uzisa ifayile entsha, ngoko abanye abaphuhlisi abanako ukuyitshintsha, kuba yena ngokwakhe ungumnikazi wayo (umzekelo, i-dev1), kwaye kungekhona umnini weprojekthi (umzekelo, iproj1). Ekubeni sinomncedisi wecala lomncedisi, okokuqala, kufuneka sazi indlela i-".git" isalathiso esakhiwe ngayo kunye nokuba iifayile ezintsha zenziwe.

Ukwenza indawo yokugcina iGit kunye nokutyhala kwi-Git server

Masiqhubele phambili kumatshini weklayenti.

Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:gittest>git init .
Initialized empty Git repository in C:/gittest/.git/

C:gittest>echo "test dev1 to proj2" > test1.txt

C:gittest>git add .

C:gittest>git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   test1.txt

C:gittest>git commit -am "new test file added"
[master (root-commit) a7ac614] new test file added
 1 file changed, 1 insertion(+)
 create mode 100644 test1.txt
 
C:gittest>git remote add origin "ssh://[email protected]/var/gitservertest/proj2"

C:gittest>git push origin master
dev1:[email protected]'s password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 243 bytes | 243.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://10.1.1.11/var/gitservertest/proj2
 * [new branch]      master -> master

C:gittest>

Kwangaxeshanye, iifayile ezintsha zenziwa kumncedisi, kwaye zezomsebenzisi owenze ukutyhala

[dev1@server proj2]$ tree
.
├── 1.txt
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── 75
│   │   └── dcd269e04852ce2f683b9eb41ecd6030c8c841
│   ├── a7
│   │   └── ac6148611e69b9a074f59a80f356e1e0c8be67
│   ├── f0
│   │   └── 82ea1186a491cd063925d0c2c4f1c056e32ac3
│   ├── info
│   └── pack
└── refs
    ├── heads
    │   └── master
    └── tags

12 directories, 18 files
[dev1@server proj2]$ ls -l objects/75/dcd269e04852ce2f683b9eb41ecd6030c8c841
-r--r--r--. 1 dev1 dev1 54 Jun 20 14:34 objects/75/dcd269e04852ce2f683b9eb41ecd6030c8c841
[dev1@server proj2]$

Xa ulayisha utshintsho kwi-Git server, iifayile ezongezelelweyo kunye nezalathisi zenziwe, kwaye umnini wazo ngokwenene ungumsebenzisi owenza ukulayisha. Kodwa ke iqela lezi fayile kunye nabalawuli bahambelana neqela eliphambili lalo msebenzisi, oko kukuthi, iqela le-dev1 lomsebenzisi we-dev1 kunye neqela le-dev2 lomsebenzisi we-dev2 (ukutshintsha iqela eliphambili lomsebenzisi womphuhlisi akuyi kunceda, kuba ke ungasebenza njani kwiiprojekthi ezininzi?). Kule meko, i-dev2 yomsebenzisi akayi kukwazi ukutshintsha iifayile ezenziwe ngumsebenzisi we-dev1, ezinokukhokelela ekuqhekekeni komsebenzi.

Linux chown - ukutshintsha umnini wefayile ngumsebenzisi oqhelekileyo

Umnini wefayile akanakutshintsha ubunini bayo. Kodwa unokutshintsha iqela lefayile eyeyakhe, kwaye ke le fayile inokuguqulwa ngabanye abasebenzisi abakwiqela elifanayo. Yiloo nto esiyidingayo.

Ukusebenzisa i-Git hook

Uluhlu olusebenzayo lwehuku luluhlu lweengcambu zeprojekthi. ihuku iphunyeziwe ebaleka phantsi komsebenzisi otyhalayo. Ukwazi oku, sinokuphumeza izicwangciso zethu.

[dev1@server proj2]$ mv hooks/post-update{.sample,}
[dev1@server proj2]$ sed -i '2,$ s/^/#/' hooks/post-update
[dev1@server proj2]$ cat <<< 'find . -group $(whoami) -exec chgrp proj2 '"'"'{}'"'"' ;' >> hooks/post-update

nokuba nje

vi hooks/post-update

Masibuyele kumatshini weklayenti.

C:gittest>echo "dev1 3rd line" >> test1.txt

C:gittest>git commit -am "3rd from dev1, testing server hook"
[master b045e22] 3rd from dev1, testing server hook
 1 file changed, 1 insertion(+)

C:gittest>git push origin master
dev1:[email protected]'s password:
   d22c66e..b045e22  master -> master

Kwi-server ye-Git, sijonga ukusebenza kwe-hook post-update script emva kokuzinikela

[dev1@server proj2]$ find . ! -group proj2

-engenanto, yonke into ilungile.

Ukuqhagamshela umphuhlisi wesibini kwiGit

Masilinganise umsebenzi womphuhlisi wesibini.

Kumxhasi

C:gittest>git remote remove origin

C:gittest>git remote add origin "ssh://[email protected]/var/gitservertest/proj2"

C:gittest>echo "!!! dev2 added this" >> test1.txt

C:gittest>echo "!!! dev2 wrote" > test2.txt

C:gittest>git add test2.txt

C:gittest>git commit -am "dev2 added to test1 and created test2"
[master 55d49a6] dev2 added to test1 and created test2
 2 files changed, 2 insertions(+)
 create mode 100644 test2.txt

C:gittest>git push origin master
[email protected]'s password:
   b045e22..55d49a6  master -> master

Kwaye kwangaxeshanye, kwiseva...

[dev1@server proj2]$ find . ! -group proj2

-ingenanto kwakhona, yonke into iyasebenza.

Ukucima iprojekthi yeGit kunye nokukhuphela iprojekthi kwi-Git server

Ewe, unokuphinda uqinisekise ukuba zonke iinguqu zigciniwe.

C:gittest>rd /S /Q .
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

Ukucima iprojekthi ye-Git, susa ngokulula uvimba weefayili ngokupheleleyo. Masiyinyamezele impazamo eyenziwayo, kuba akunakwenzeka ukucima uvimba weefayili wangoku usebenzisa lo myalelo, kodwa le yindlela yokuziphatha esiyifunayo.

C:gittest>dir
 Содержимое папки C:gittest

21.06.2019  08:43    <DIR>          .
21.06.2019  08:43    <DIR>          ..

C:gittest>git clone ssh://[email protected]/var/gitservertest/proj2
Cloning into 'proj2'...
[email protected]'s password:

C:gittest>cd proj2

C:gittestproj2>dir
 Содержимое папки C:gittestproj2

21.06.2019  08:46    <DIR>          .
21.06.2019  08:46    <DIR>          ..
21.06.2019  08:46               114 test1.txt
21.06.2019  08:46                19 test2.txt
C:gittestproj2>type test1.txt
"test dev1 to proj2"
"dev1 added some omre"
"dev1 3rd line"
"!!! dev2 added this"

C:gittestproj2>type test2.txt
"!!! dev2 wrote"

Ukwabelana ngokufikelela kwiGit

Ngoku masiqinisekise ukuba nangeGit umakhi wesibini akanakufikelela kwiprojekthi yeProj1, angasebenzi kuyo.

C:gittestproj2>git remote remove origin

C:gittestproj2>git remote add origin "ssh://[email protected]/var/gitservertest/proj1"

C:gittestproj2>git push origin master
[email protected]'s password:
fatal: '/var/gitservertest/proj1' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Ngoku sivumela ukufikelela

[root@server ~]# usermod -aG proj1 dev2

kwaye emva koko yonke into iyasebenza.

C:gittestproj2>git push origin master
[email protected]'s password:
To ssh://10.1.1.11/var/gitservertest/proj1
 * [new branch]      master -> master

Ulwazi olongezelelekileyo

Ukongeza, ukuba kukho ingxaki kwiimvume ezingagqibekanga xa usenza iifayile kunye nabalawuli, kwi-CentOS ungasebenzisa umyalelo.

setfacl -Rd -m o::5 -m g::7 /var/gitservertest

Kwakhona kwinqaku unokukhubeka kwizinto ezincinci eziluncedo:

  • indlela yokwakha umthi wolawulo kwiLinux
  • ugqithisa njani uluhlu lweedilesi kwi sed ukusuka kumgca othile ukuya ekupheleni kwefayile, oko kukuthi, yenza uguqulelo kwi sed kuyo yonke imigca ngaphandle komgca wokuqala.
  • Ungayijika njani imeko yokukhangela kwiLinux fumana
  • Uyigqitha njani imigca emininzi kwiluphu usebenzisa ilina enye kwiqokobhe le Linux
  • Ubaleka njani ukucaphula okukodwa kwi-bash
  • Ucima njani uvimba weefayili kunye nayo yonke imixholo yayo kwi-Windows umgca womyalelo
  • Uyisebenzisa njani i-bash mv ukuyibiza ngokutsha ifayile ngaphandle kokuphinda uyibhale kwakhona

Ndiyabonga ngengqalelo yakho.

umthombo: www.habr.com

Yongeza izimvo