Organisasyon sa multi-user nga pag-access sa GIT server

Kung nag-install ug nag-configure sa usa ka Git server, ang pangutana mitungha bahin sa pag-organisar sa pag-access alang sa daghang mga tiggamit sa daghang mga proyekto. Gisusi nako ang isyu ug nakit-an ang solusyon nga nakab-ot ang tanan nakong mga kinahanglanon: yano, luwas, kasaligan.

Ang akong mga pangandoy mao ang:

  • ang matag user nagkonektar sa ilang kaugalingong account
  • Daghang mga tiggamit mahimo’g magtrabaho sa usa ka proyekto
  • ang sama nga tiggamit makahimo sa pagtrabaho sa daghang mga proyekto
  • ang matag user adunay access lamang sa mga proyekto diin siya nagtrabaho
  • Mahimong posible nga makonektar pinaagi sa command line, ug dili lamang pinaagi sa usa ka matang sa web interface

Nindot usab kini:

  • paghatag ug read-only nga permiso sa pagkontrolar sa mga tawo
  • Sayon nga pagdumala sa mga katungod sa pag-access sa gumagamit sa Git

Overview sa posible nga mga kapilian sa pag-access sa GIT server

Una sa tanan, kinahanglan nimo mahibal-an kung unsa ang pilion, busa ania ang usa ka dali nga pagtan-aw sa mga protocol sa Git.

  • ssh - usa ka espesyal nga gibuhat nga account sa gumagamit gigamit aron ma-access ang server.
    • Katingad-an nga wala iapil sa Git gikan sa mga rekomendasyon niini ang paggamit sa usa ka account aron ma-access ang tanan nga mga repositoryo. Kini wala gayud makatuman sa akong mga kinahanglanon.
    • Mahimo nimong gamiton ang daghang mga account, apan unsaon nimo limitahan ang pag-access sa user sa pipila ra nga mga direktoryo?
      • Ang pagsira sa direktoryo sa balay dili angay, tungod kay lisud ang pag-organisar sa pag-access sa pagsulat didto alang sa ubang mga tiggamit
      • Ang paggamit sa mga symlink gikan sa imong direktoryo sa balay lisud usab tungod kay wala kini gihubad sa Git ingon mga link
      • Posible nga higpitan ang pag-access sa tighubad, apan wala’y hingpit nga garantiya nga kini kanunay nga molihok
        • Sa kasagaran mahimo nimong ikonektar ang imong kaugalingong command interpreter alang sa maong mga tiggamit, apan
          • una, kini usa na ka matang sa lisud nga desisyon,
          • ug ikaduha, kini mahimong likayan.

    Apan tingali kini dili usa ka problema nga ang user makahimo sa pagpatuman sa bisan unsa nga mga sugo?.. Sa kinatibuk-an, kini nga pamaagi dili mahimong isalikway kon kamo mahibalo sa tukma kon sa unsang paagi sa paggamit niini. Mobalik kita niini nga pamaagi sa ulahi, apan sa pagkakaron atong hisgotan sa makadiyot ang ubang mga alternatibo, tingali adunay mas simple.

  • Ang git local protocol mahimong magamit sa kombinasyon sa mga sshfs, daghang mga tiggamit ang mahimong magamit, apan sa tinuud parehas sa miaging kaso
  • http - read-only
  • Ang git kay read-only
  • https - lisud i-install, kinahanglan nimo ang dugang nga software, usa ka matang sa control panel aron ma-organisar ang pag-access sa gumagamit ... kini mahimo’g mahimo, apan sa usa ka paagi komplikado ang tanan.

Gamit ang ssh protocol sa pag-organisar sa multi-user access sa Git server

Balik ta sa ssh protocol.

Tungod kay gigamit nimo ang ssh nga pag-access alang sa git, kinahanglan nimo nga masiguro ang seguridad sa data sa server. Ang user nga nagkonektar pinaagi sa ssh naggamit sa ilang kaugalingong login sa Linux server, aron sila makakonektar pinaagi sa ssh client ug maka-access sa command line sa server.
Walay hingpit nga panalipod batok sa maong pag-access.

Apan ang tiggamit kinahanglan dili interesado sa mga file sa Linux. Ang hinungdanon nga kasayuran gitipigan lamang sa git repository. Busa, posible nga dili pugngan ang pag-access pinaagi sa command line, apan ang paggamit sa mga himan sa Linux aron idili ang tiggamit sa pagtan-aw sa mga proyekto, dili apil ang iyang giapilan.
Ang klaro nga kapilian mao ang paggamit sa sistema sa pagtugot sa Linux.

Sama sa nahisgotan na, posible nga mogamit lamang sa usa ka account alang sa pag-access sa ssh. Kini nga pag-configure dili luwas alang sa daghang mga tiggamit, bisan kung kini gilakip sa lista sa girekomenda nga mga kapilian sa git.

Aron mapatuman ang mga kinahanglanon nga gihatag sa sinugdanan sa artikulo, ang mosunud nga istruktura sa direktoryo gihimo uban ang pagtudlo sa mga katungod ug mga tag-iya:

1) mga direktoryo sa proyekto

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
diin
dir1, dir2, dir3 - mga direktoryo sa proyekto: proyekto 1, proyekto 2, proyekto 3.

proj1:proj1, proj2:proj2, proj3:proj3 espesyal nga gibuhat sa Linux user nga gi-assign isip mga tag-iya sa katugbang nga mga direktoryo sa proyekto.

permiso para sa tanang direktoryo gitakda sa 0770 - bug-os nga pag-access para sa tag-iya ug sa iyang grupo ug kompletong pagdili para sa uban.

2) mga account sa developer

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

Ang yawe nga punto mao nga ang mga nag-develop gihatagan usa ka dugang nga grupo sa tag-iya sa tiggamit sa sistema sa katugbang nga proyekto. Gihimo kini sa tigdumala sa server sa Linux nga adunay usa ka mando.

Niini nga pananglitan, ang "Developer 1" nagtrabaho sa mga proyekto nga proj1 ug proj2, ug ang "Developer 2" nagtrabaho sa mga proyekto nga proj2 ug proj3.

Kung adunay bisan kinsa sa mga Developer nga nagkonektar pinaagi sa ssh pinaagi sa command line, nan ang ilang mga katungod dili igo bisan sa pagtan-aw sa mga sulud sa mga direktoryo sa proyekto diin wala sila moapil. Dili niya kini usbon sa iyang kaugalingon.

Tungod kay ang sukaranan niini nga prinsipyo mao ang sukaranan nga seguridad sa mga katungod sa Linux, kini nga laraw kasaligan. Dugang pa, ang laraw dali kaayo nga ipangalagad.

Magpadayon ta sa pagpraktis.

Paghimo sa Git repository sa usa ka Linux server

Atong susihon.

[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

Gikapoy na ko sa pag-type gamit ang kamot...

[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

Kami kombinsido nga imposible nga ma-access ang mga repositoryo sa ubang mga tawo gikan sa command line ug bisan sa pagtan-aw sa ilang mga sulod.

[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

Pakigtambayayong sa daghang mga developer sa parehas nga proyekto sa Git

Nagpabilin ang usa ka pangutana, kung ang usa ka developer nagpaila sa usa ka bag-ong file, nan ang ubang mga developer dili makausab niini, tungod kay siya mismo ang tag-iya niini (pananglitan, dev1), ug dili ang tag-iya sa user sa proyekto (pananglitan, proj1). Tungod kay kita adunay usa ka server-side repository, una sa tanan, kinahanglan natong mahibal-an kung giunsa ang ".git" nga direktoryo gi-istruktura ug kung ang mga bag-ong file gimugna.

Paghimo og lokal nga Git repository ug pagduso sa Git server

Mopadayon kita sa makina sa kliyente.

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>

Sa parehas nga oras, ang mga bag-ong file gihimo sa server, ug kini iya sa tiggamit nga naghimo sa pagduso

[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]$

Kung mag-upload ka og mga pagbag-o sa Git server, ang dugang nga mga file ug direktoryo gihimo, ug ang tag-iya niini mao ang tiggamit nga naghimo sa pag-upload. Apan ang grupo sa kini nga mga file ug direktoryo katumbas usab sa panguna nga grupo sa kini nga tiggamit, nga mao, ang dev1 nga grupo alang sa dev1 nga tiggamit ug ang dev2 nga grupo alang sa dev2 nga tiggamit (ang pagbag-o sa panguna nga grupo sa tiggamit sa developer dili makatabang, tungod kay kung giunsa nimo pagtrabaho ang daghang mga proyekto?). Niini nga kaso, ang user dev2 dili makahimo sa pag-usab sa mga file nga gihimo sa user dev1, nga mahimong mosangpot sa pagkaguba sa functionality.

Linux chown - pagbag-o sa tag-iya sa usa ka file sa usa ka regular nga tiggamit

Ang tag-iya sa usa ka file dili makausab sa pagpanag-iya niini. Apan mahimo niyang usbon ang grupo sa usa ka file nga iyaha, ug unya kini nga file mahimong usbon sa ubang mga tiggamit nga naa sa parehas nga grupo. Mao kana ang atong gikinahanglan.

Paggamit sa Git hook

Ang working directory alang sa hook mao ang root directory sa proyekto. Ang hook usa ka executable nga nagdagan sa ilawom sa tiggamit nga nagduso. Sa pagkahibalo niini, mahimo natong ipatuman ang atong mga plano.

[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

o lang

vi hooks/post-update

Balik ta sa makina sa kliyente.

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

Sa Git server, among gisusi ang operasyon sa hook post-update script pagkahuman sa commit

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

- walay sulod, maayo ang tanan.

Pagkonektar sa ikaduhang developer sa Git

Atong i-simulate ang buhat sa ikaduhang developer.

Sa kliyente

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

Ug sa samang higayon, sa server...

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

- walay sulod pag-usab, ang tanan nagtrabaho.

Pagtangtang sa proyekto sa Git ug pag-download sa proyekto gikan sa Git server

Aw, mahimo nimong masiguro pag-usab nga ang tanan nga mga pagbag-o na-save na.

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

- aron mapapas ang usa ka proyekto sa Git, hingpit nga limpyohan ang direktoryo. Atong atubangon ang sayup nga nahimo, tungod kay imposible nga mapapas ang karon nga direktoryo gamit kini nga mando, apan kini gyud ang pamatasan nga kinahanglan naton.

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"

Pagpaambit sa access sa Git

Karon siguruha naton nga bisan pinaagi sa Git ang ikaduha nga developer dili maka-access sa proyekto sa Proj1, diin wala siya nagtrabaho.

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.

Karon gitugotan namon ang pag-access

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

ug human niana ang tanan molihok.

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

Alang sa dugang nga impormasyon,

Dugang pa, kung adunay problema sa default nga permiso sa paghimo og mga file ug direktoryo, sa CentOS mahimo nimong gamiton ang command

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

Usab sa artikulo mahimo kang mapandol sa gagmay nga mapuslanon nga mga butang:

  • unsaon paghimo og direktoryo nga punoan sa Linux
  • kung giunsa pagpasa ang usa ka lainlaing mga adres sa sed gikan sa usa ka linya hangtod sa katapusan sa file, nga mao, paghimo usa ka kapuli sa sed sa tanan nga linya gawas sa una nga linya
  • Giunsa pagbag-o ang kahimtang sa pagpangita sa pagpangita sa Linux
  • Giunsa pagpasa ang daghang linya sa usa ka loop gamit ang usa ka liner sa Linux shell
  • Giunsa ang pag-ikyas sa usa ka kinutlo sa bash
  • unsaon pagtangtang sa usa ka direktoryo uban ang tanang sulod niini sa windows command line
  • Giunsa paggamit ang bash mv aron mabag-o ang ngalan sa usa ka file nga wala kini gisulat pag-usab

Salamat sa imong pagtagad.

Source: www.habr.com

Idugang sa usa ka comment