Как разрешить третьей стороне развиваться против части нашего дерева мерзавцев? - PullRequest
3 голосов
/ 22 июня 2011

Мы используем git для нашего проекта. У нас есть подрядчик, который будет работать над некоторым нашим кодом, но мы хотим запретить им доступ к определенному небольшому списку конфиденциальных исходных файлов и каталогов. Я считаю, что для достижения этой цели нужно создать форк нашего основного репо на новом сервере и предоставить подрядчику доступ только ко второму репо. Каким-то образом мы исключим конфиденциальные файлы / каталоги из этого второго репо - но мне нужно знать, как это сделать. (У нас была одна идея - создать ветку в исходном репо, вручную удалить эти файлы из ветки и затем выполнить ветвление только из этой ветки?) Периодически один из наших доверенных разработчиков будет перетягивать все изменения из исходного репо во вторичную копию , а также периодически они будут выдвигать изменения, сделанные нашим подрядчиком в первоначальное репо.

Может кто-нибудь помочь мне определить, как именно это сделать? Я хочу, чтобы наши цели в области безопасности были выполнены на 100%.

Мои исследования побудили меня попробовать следующий подход. Вот мои шаги для установки, которые, я надеялся, были на правильном пути:

# We host our repo on our own server, which we all share access to via SSH.
# On this shared server we keep our git repo under:
#   /git/main-repo.git
cd /git

# make a brand-new repo which will eventually be copied to a new server
# our contractor will be given access to this repo only
git init --bare --shared restricted-repo.git

# now push the old repo (master branch only - he won't need our other branches) into the new empty repo
cd /git/main-repo.git
git push /git/restricted-repo.git 'master:master'

cd  /git/restricted-repo.git
# remove anything to do with our sensitive files.  Assume they start with "sensitive" in their filename
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch src/sensitive*' HEAD

# from my research these cmds seem necessary.  I wonder if it's valid to run the from the bare repo, but 
# git allows this with no errors so I hope it worked.  The commands return almost instantly.
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all

# this clearly does work, and takes a while
git gc --aggressive --prune=now

Теперь у меня есть два репо, я могу клонировать и работать с каждым, но я не знаю, как синхронизировать изменения между основным и ограниченным репо. Я попытался добавить один в качестве удаленного из другого и извлечь из апстрима, но это приносит все ветви от мастера, а также создает конфликты слияния, когда у меня есть изменения в обоих местах (даже если изменения находятся в разных файлах).

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

Если часть вашего репозитория управляется по-другому, это должен быть другой репозиторий.

Вы не можете одновременно удалить доступ к этим файлам и их следы, а также вести общую историю в одном репозитории.

4 голосов
/ 22 июня 2011

Клонируйте свое репо.Не делайте это голым, так как это ограничит то, что вы можете сделать с filter-branch.

git clone /c/your/path/to/repo

зайдите в репо

cd !$:t 

потеряете связь с репо, клонированным из

git remote rm origin

Создайте ветку с именем for-external.

git checkout -b for-external

Теперь запустите git filter-branch, чтобы сохранить только те каталоги, которыми вы хотите поделиться.

git filter-branch --subdirectory-filter path/to/your/project/to/share

Очистить

git branch | grep -v 'external' | xargs git branch -D
git gc --prune=now

Клонировать это где-то, как развернуться, чтобы дать ему доступ к нему.Теперь вы можете вносить изменения, которые он вносит, добавив эту новую партию в качестве удаленного к вашему личному репо.

git remote add unfuddle <url to your unfuddle repo>
git push -u unfuddle for-external:integration

Теперь вы можете внести его изменения и переназначить их поверх используемой вами ветви - возможно, новой, называемой "из-за границы".Затем вы можете объединить его изменения с вашими обычными ветками.Это можно сделать из обычного репо, а не из того, который вы изначально клонировали.

git remote add unfuddle <url to your unfuddle repo>
git fetch unfuddle
git branch -t from-consultant unfuddle/integration

Не пытайтесь развернуться отсюда, иначе вы можете случайно нажать на ветку, в которой есть другая информация.Вы можете создать другого пользователя и использовать другой ключ ssh, чтобы обеспечить доступ только для чтения к восстановленному репо из этого репо.

Вы можете использовать альтернативный URL в последней удаленной команде, которая соответствует ~ / .sshЗапись / config, которая сопоставит его с URL-адресом отката, но предлагает другой ключ с ограничением только для чтения.

Теперь, когда вы git fetch unfuddle в своем исходном хранилище, вы можете получить его последние коммиты.Если вы хотите внести в него работу, вам нужно будет вытолкнуть его из другого репозитория, что потребует от вас добавления пульта снова, но будьте осторожны.

В прошлом это прекрасно работало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...