Информация об изменениях

Сообщение Re: Git, Как решаете вопрос с разграничением доступа? от 11.08.2018 11:42

Изменено 11.08.2018 13:48 Evgeny.Panasyuk

Re: Git, Как решаете вопрос с разграничением доступа?
Здравствуйте, CoderMonkey, Вы писали:

CM>Есть репозиторий с большим проектом. Нужно дать фрилансеру доступ к части этого проекта, которая находится в подкаталоге. Что-то я ищу и не вижу ни одного внятного способа это сделать.

CM>Это вообще возможно?

Ежели submodule не подходит, есть другие варианты:

Вариант 1, топорный:
отошлите ему текущее содержимое поддиректории с полным относительным путём к ней, он положит её в локальный независимый гит, и будет слать вам патчикоммиты через git format-patch, вы их будите накатывать через git am. Авторство и таймстампы при этом не теряются. Примерно подобным способом (format-patch/am) например разрабатывается ядро Linux.

Вариант 2, subtree:
используя subtree сделайте git subtree split/push на требуемую под-папку — у вас получится отдельный репозиторий файловый корень которого соответствует под директории, к нему можете дать доступ на чтение запись. Когда вам нужно будет накатить его изменения назад — делаете git subtree pull/merge.
Re: Git, Как решаете вопрос с разграничением доступа?
Здравствуйте, CoderMonkey, Вы писали:

CM>Есть репозиторий с большим проектом. Нужно дать фрилансеру доступ к части этого проекта, которая находится в подкаталоге. Что-то я ищу и не вижу ни одного внятного способа это сделать.

CM>Это вообще возможно?

Ежели submodule не подходит, есть другие варианты:

Вариант 1, топорный:
отошлите ему текущее содержимое поддиректории с полным относительным путём к ней, он положит её в локальный независимый гит, и будет слать вам патчикоммиты через git format-patch, вы их будите накатывать через git am. Авторство и таймстампы при этом не теряются. Примерно подобным способом (format-patch/am) например разрабатывается ядро Linux.

Вариант 2, subtree:
используя subtree сделайте git subtree split/push на требуемую под-папку — у вас получится отдельный репозиторий файловый корень которого соответствует под директории, к нему можете дать доступ на чтение запись. Когда вам нужно будет накатить его изменения назад — делаете git subtree pull/merge.
  пример
[tmp]$ mkdir main bare sub
[tmp]$ git init --bare bare
Initialized empty Git repository in /tmp/tmp/bare/
[tmp]$ cd main
[main]$ git init .
Initialized empty Git repository in /tmp/tmp/main/.git/
[main]$ git config user.name main; git config user.email main
[main]$ echo secret > secret
[main]$ mkdir lib
[main]$ echo from main > lib/libfile
[main]$ git add .
[main]$ git commit -m initial
[master (root-commit) 1e3a160] initial
 2 files changed, 2 insertions(+)
 create mode 100644 lib/libfile
 create mode 100644 secret
[main]$ git subtree split --rejoin -P lib/ -b subbranch master
Merge made by the 'ours' strategy.
Created branch 'subbranch'
a3f0266f9201b63091cb436728492bb5d350c047
[main]$ git subtree push -P lib/ ../bare  master
git push using:  ../bare master
Counting objects: 3, done.
Writing objects: 100% (3/3), 200 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../bare
 * [new branch]      a3f0266f9201b63091cb436728492bb5d350c047 -> master
[main]$ pushd ../sub
/tmp/tmp/sub /tmp/tmp/main
[sub]$ git clone ../bare .
Cloning into '.'...
done.
[sub]$ git config user.name sub; git config user.email sub
[sub]$ echo from sub >> libfile
[sub]$ cat libfile
from main
from sub
[sub]$ git commit -am "from sub"
[master e062384] from sub
 1 file changed, 1 insertion(+)
[sub]$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 233 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /tmp/tmp/sub/../bare
   a3f0266..e062384  master -> master
[sub]$ popd
/tmp/tmp/main
[main]$ git subtree pull -P lib/ ../bare  master
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../bare
 * branch            master     -> FETCH_HEAD
error: Terminal is dumb, but EDITOR unset
Not committing merge; use 'git commit' to complete the merge.
[main]$ git commit -m merge
[master 4585fd7] merge
[main]$ git --no-pager log --stat
commit 4585fd761a12b31aa87f1b24544ef3154f081135
Merge: 82ee06f e062384
Author: main <main>
Date:   Sat Aug 11 21:39:16 2018 +0800

    merge

commit e062384de33eb5422063a49b6e20a43a8fbc242b
Author: sub <sub>
Date:   Sat Aug 11 21:39:05 2018 +0800

    from sub

 libfile | 1 +
 1 file changed, 1 insertion(+)

commit 82ee06f984545e2e24448e11b8d20c72b5f09191
Merge: 1e3a160 a3f0266
Author: main <main>
Date:   Sat Aug 11 21:38:32 2018 +0800

    Split 'lib/' into commit 'a3f0266f9201b63091cb436728492bb5d350c047'

    git-subtree-dir: lib
    git-subtree-mainline: 1e3a160a6c91c60a222ee196b8a9bd3fe795eace
    git-subtree-split: a3f0266f9201b63091cb436728492bb5d350c047

commit a3f0266f9201b63091cb436728492bb5d350c047
Author: main <main>
Date:   Sat Aug 11 21:38:30 2018 +0800

    initial

 libfile | 1 +
 1 file changed, 1 insertion(+)

commit 1e3a160a6c91c60a222ee196b8a9bd3fe795eace
Author: main <main>
Date:   Sat Aug 11 21:38:30 2018 +0800

    initial

 lib/libfile | 1 +
 secret      | 1 +
 2 files changed, 2 insertions(+)
[main]$ cd ../bare
[bare]$ ls
branches  config  description  HEAD  hooks  info  objects  refs
[bare]$ cd objects/
[objects]$ find -type f | tr -d ./ | xargs -L1 -i bash -c 'echo contents of {} ---------------; git cat-file -p {}'
contents of a3f0266f9201b63091cb436728492bb5d350c047 ---------------
tree 7696b154e1692d288941d66c4cff126d57d847a6
author main <main> 1533994710 +0800
committer main <main> 1533994710 +0800

initial
contents of e062384de33eb5422063a49b6e20a43a8fbc242b ---------------
tree fd300cd47abfb8776165b929faed376ea3205306
parent a3f0266f9201b63091cb436728492bb5d350c047
author sub <sub> 1533994745 +0800
committer sub <sub> 1533994745 +0800

from sub
contents of 26f343c083952217e74b016dda8c88e11cf5b394 ---------------
from main
contents of d2292eabd746fb92dd0f20f51d8fcced705ca5aa ---------------
from main
from sub
contents of 7696b154e1692d288941d66c4cff126d57d847a6 ---------------
100644 blob 26f343c083952217e74b016dda8c88e11cf5b394    libfile
contents of fd300cd47abfb8776165b929faed376ea3205306 ---------------
100644 blob d2292eabd746fb92dd0f20f51d8fcced705ca5aa    libfile