Ташкили дастрасии бисёркорбарон ба сервери GIT

Ҳангоми насб ва конфигуратсия кардани сервери Git, савол дар бораи ташкили дастрасии якчанд корбарон ба якчанд лоиҳаҳо ба миён меояд. Ман ин масъаларо таҳқиқ кардам ва роҳи ҳалли худро ёфтам, ки ба ҳама талаботҳои ман ҷавобгӯ бошад: оддӣ, бехатар, боэътимод.

Орзуҳои ман инҳоянд:

  • ҳар як корбар бо ҳисоби худ пайваст мешавад
  • Якчанд корбарон метавонанд дар як лоиҳа кор кунанд
  • як корбар метавонад дар якчанд лоиҳаҳо кор кунад
  • ҳар як корбар танҳо ба он лоиҳаҳое дастрасӣ дорад, ки дар онҳо ӯ кор мекунад
  • Он бояд тавассути сатри фармон пайваст шудан мумкин бошад, на танҳо тавассути як намуди веб-интерфейс

Инчунин олиҷаноб мебуд:

  • ба шахсони назораткунанда иҷозати танҳо барои хондан диҳед
  • Ҳуқуқҳои дастрасии корбаронро дар Git ба осонӣ идора кунед

Баррасии имконоти имконпазири дастрасӣ ба сервери GIT

Пеш аз ҳама, шумо бояд бидонед, ки чӣ интихоб кардан лозим аст, бинобар ин дар ин ҷо шарҳи мухтасари протоколҳои Git оварда шудааст.

  • ssh - ҳисоби корбарии махсус сохташуда барои дастрасӣ ба сервер истифода мешавад.
    • Аҷиб аст, ки Git аз тавсияҳои худ истифодаи як ҳисобро барои дастрасӣ ба ҳама анборҳо истисно намекунад. Ин ба талаботи ман тамоман ҷавоб намедиҳад.
    • Шумо метавонед ҳисобҳои сершуморро истифода баред, аммо чӣ гуна метавон дастрасии корбаронро танҳо ба феҳристҳои муайян маҳдуд кард?
      • Пӯшидани феҳристи хонагӣ мувофиқ нест, зеро ташкили дастрасии навиштан дар он ҷо барои корбарони дигар мушкил аст
      • Истифодаи истинодҳои рамзӣ аз феҳристи хонагии шумо низ душвор аст, зеро Git онҳоро ҳамчун истинод шарҳ намедиҳад
      • Дастрасӣ ба тарҷумонро маҳдуд кардан мумкин аст, аммо кафолати пурраи он нест, ки он ҳамеша кор хоҳад кард
        • Шумо умуман метавонед тарҷумони фармони худро барои чунин корбарон пайваст кунед, аммо
          • аввалан, ин аллакай як навъ қарори душвор аст,
          • сониян, аз ин пеш гузаштан мумкин аст.

    Аммо шояд мушкиле нест, ки корбар метавонад ягон фармонро иҷро кунад?.. Умуман, ин усулро истисно кардан мумкин нест, агар шумо дақиқ фаҳмед, ки чӣ тавр истифода бурдани он. Мо дертар ба ин усул бармегардем, аммо ҳоло мо ба таври мухтасар алтернативаҳои дигарро баррасӣ мекунем, шояд чизи соддатаре бошад.

  • Протоколи маҳаллии git метавонад дар якҷоягӣ бо sshfs истифода шавад, корбарони сершумор метавонанд истифода шаванд, аммо аслан бо ҳолати қаблӣ якхела аст
  • http - танҳо барои хондан
  • git танҳо барои хондан аст
  • https - насб кардан душвор аст, ба шумо нармафзори иловагӣ, як намуди панели идоракунӣ лозим аст, то дастрасии корбаронро ташкил кунад ... ин имконпазир ба назар мерасад, аммо ҳама чиз мураккаб аст.

Истифодаи протоколи ssh барои ташкили дастрасии бисёркорбар ба сервери Git

Биёед ба протоколи ssh баргардем.

Азбаски шумо дастрасии ssh-ро барои git истифода мебаред, шумо бояд амнияти маълумоти серверро таъмин кунед. Корбаре, ки тавассути ssh пайваст мешавад, логини шахсии худро дар сервери Linux истифода мебарад, то онҳо метавонанд тавассути муштарии ssh пайваст шаванд ва ба сатри фармони сервер дастрасӣ пайдо кунанд.
Ҳифзи пурра аз чунин дастрасӣ вуҷуд надорад.

Аммо корбар набояд ба файлҳои Linux таваҷҷӯҳ кунад. Маълумоти муҳим танҳо дар анбори git нигоҳ дошта мешавад. Аз ин рӯ, дастрасиро тавассути сатри фармон маҳдуд накардан мумкин аст, балки бо истифода аз асбобҳои Linux барои манъ кардани корбар аз дидани лоиҳаҳо, ба истиснои лоиҳаҳое, ки ӯ дар онҳо иштирок мекунад, манъ карда мешавад.
Интихоби равшан ин истифодаи системаи иҷозатҳои Linux мебошад.

Тавре ки аллакай зикр гардид, барои дастрасии ssh танҳо як ҳисоб истифода бурдан мумкин аст. Ин конфигуратсия барои якчанд корбарон хатарнок аст, гарчанде ки он ба рӯйхати имконоти тавсияшудаи git дохил карда шудааст.

Барои амалӣ намудани талаботи дар аввали мақола овардашуда сохтори зерини феҳрист бо додани ҳуқуқ ва соҳибмулкон таъсис дода мешавад:

1) директорияҳои лоиҳа

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
ки
dir1, dir2, dir3 - директорияҳои лоиҳа: лоиҳаи 1, лоиҳаи 2, лоиҳаи 3.

proj1:proj1, proj2:proj2, proj3:proj3 корбарони махсуси Linux офарида шудаанд, ки ба ҳайси соҳибони директорияҳои мувофиқи лоиҳа таъин шудаанд.

иҷозатҳо барои ҳама директорияҳо ба 0770 муқаррар карда шудаанд - дастрасии пурра барои соҳиб ва гурӯҳи ӯ ва манъи пурра барои ҳама.

2) ҳисобҳои таҳиякунанда

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

Нуқтаи асосӣ дар он аст, ки таҳиягарон як гурӯҳи иловагии соҳиби корбари система барои лоиҳаи мувофиқ таъин карда мешаванд. Ин аз ҷониби маъмури сервери Linux бо як фармон анҷом дода мешавад.

Дар ин мисол, "Developer 1" дар лоиҳаҳои proj1 ва proj2 кор мекунад ва "Developer 2" дар лоиҳаҳои proj2 ва proj3 кор мекунад.

Агар яке аз таҳиягарон тавассути ssh тавассути сатри фармон пайваст шавад, ҳуқуқи онҳо ҳатто барои дидани мундариҷаи директорияҳои лоиҳа, ки дар онҳо иштирок намекунанд, кифоя нахоҳад буд. Вай инро худаш тагьир дода наметавонад.

Азбаски асоси ин принсип амнияти асосии ҳуқуқҳои Linux мебошад, ин схема боэътимод аст. Илова бар ин, идора кардани нақша хеле осон аст.

Биёед ба амалия гузарем.

Эҷоди анбори Git дар сервери Linux

Биёед тафтиш кунем.

[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

Аз чопи дастӣ хаста шудаам...

[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

Мо итминон дорем, ки аз сатри фармон дастрасӣ ба анбори одамони дигар ва ҳатто дидани мундариҷаи онҳо ғайриимкон аст.

[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

Бо таҳиягарони сершумор дар як лоиҳа дар Git ҳамкорӣ кунед

Як савол боқӣ мемонад, ки агар як таҳиякунанда файли навро ҷорӣ кунад, дигар таҳиягарон онро тағир дода наметавонанд, зеро худи ӯ соҳиби он аст (масалан, dev1), на соҳиби корбари лоиҳа (масалан, proj1). Азбаски мо анбори сервер дорем, пеш аз ҳама, мо бояд бидонем, ки директорияи ".git" чӣ гуна сохтор шудааст ва оё файлҳои нав сохта мешаванд.

Эҷоди анбори маҳаллии Git ва тела додан ба сервери Git

Биёед ба мошини муштарӣ гузарем.

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>

Ҳамзамон дар сервер файлҳои нав эҷод карда мешаванд ва онҳо ба корбаре, ки push-ро иҷро кардааст, тааллуқ доранд

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

Вақте ки шумо тағиротро ба сервери Git бор мекунед, файлҳо ва директорияҳои иловагӣ эҷод мешаванд ва соҳиби онҳо воқеан корбарест, ки боргузорӣ мекунад. Аммо баъдан гурӯҳи ин файлҳо ва директорияҳо низ ба гурӯҳи асосии ин корбар мувофиқат мекунад, яъне гурӯҳи dev1 барои корбари dev1 ва гурӯҳи dev2 барои корбари dev2 (тағйир додани гурӯҳи асосии корбари таҳиякунанда кӯмак намекунад, зеро пас чӣ гуна шумо метавонед дар якчанд лоиҳаҳо кор кунед?). Дар ин ҳолат, корбар dev2 наметавонад файлҳои аз ҷониби корбар dev1 эҷодшударо тағир диҳад, ки метавонад боиси вайрон шудани функсия гардад.

Linux chown - тағир додани соҳиби файл аз ҷониби корбари муқаррарӣ

Соҳиби файл наметавонад моликияти онро тағир диҳад. Аммо ӯ метавонад гурӯҳи файлеро, ки ба ӯ тааллуқ дорад, тағир диҳад ва баъдан ин файлро дигар корбароне, ки дар як гурӯҳ ҳастанд, тағир дода метавонанд. Ин ба мо лозим аст.

Истифодаи Git hook

Феҳристи корӣ барои қалмоқ директорияи решаи лоиҳа мебошад. hook як файли иҷрошаванда аст, ки дар зери корбар иҷро мешавад, ки пахш мекунад. Мо инро дониста, накшахои худро амалй гардонда метавонем.

[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

ё танҳо

vi hooks/post-update

Биёед ба мошини муштарӣ баргардем.

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

Дар сервери Git, мо кори скрипти пас аз навсозии қалмоқро пас аз иҷроиш тафтиш мекунем

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

- холӣ, ҳамааш хуб аст.

Пайваст кардани як таҳиягари дуюм дар Git

Биёед кори таҳиягари дуюмро тақлид кунем.

Дар бораи муштарӣ

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

Ва дар айни замон, дар сервер ...

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

— боз холй, хама кор мекунад.

Нест кардани лоиҳаи Git ва зеркашии лоиҳа аз сервери Git

Хуб, шумо метавонед бори дигар боварӣ ҳосил кунед, ки ҳамаи тағиротҳо захира шудаанд.

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

— барои нест кардани лоиҳаи Git, танҳо директорияро пурра тоза кунед. Биёед бо хатогие, ки тавлид мешавад, тоқат кунем, зеро бо истифода аз ин фармон феҳристи ҷорӣро нест кардан ғайриимкон аст, аммо ин маҳз рафтори мо лозим аст.

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"

Мубодилаи дастрасӣ дар Git

Акнун биёед боварӣ ҳосил кунем, ки ҳатто тавассути Git таҳиягари дуюм наметавонад ба лоиҳаи Proj1, ки дар он кор намекунад, дастрасӣ пайдо кунад.

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.

Ҳоло мо ба дастрасӣ иҷозат медиҳем

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

ва баъд аз он ҳама чиз кор мекунад.

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

Барои маълумоти бештар,

Илова бар ин, агар ҳангоми эҷоди файлҳо ва директорияҳо бо иҷозатҳои пешфарз мушкилот вуҷуд дошта бошад, дар CentOS шумо метавонед фармонро истифода баред.

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

Инчунин дар мақола шумо метавонед ба чизҳои хурди муфид дучор шавед:

  • Чӣ тавр сохтани дарахти директория дар Linux
  • чӣ тавр як қатор суроғаҳоро дар sed аз сатри муайян ба охири файл интиқол додан мумкин аст, яъне иваз кардани sed дар ҳама сатрҳо ба ҷуз сатри аввал
  • Чӣ гуна ҳолати ҷустуҷӯро дар Linux пайдо кардан мумкин аст
  • Чӣ тавр бо истифода аз як лайнер дар қабати Linux чанд сатрро ба як ҳалқа интиқол додан мумкин аст
  • Чӣ тавр аз нохунакҳои ягона дар bash халос шудан мумкин аст
  • чӣ тавр нест кардани директория бо тамоми мундариҷаи он дар сатри фармони Windows
  • Чӣ тавр истифода бурдани bash mv барои тағир додани номи файл бидуни дубора навиштани он

Ташаккур ба диққататон.

Манбаъ: will.com

Илова Эзоҳ