如何允许第三方针对我们的git树的一部分进行开发?

时间:2011-06-21 22:45:12

标签: git

我们在项目中使用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

现在我有两个存储库,我可以从每个存储库进行克隆和工作,但我不知道如何在main-repo和restricted-repo之间同步更改。我尝试添加一个作为另一个的远程并从上游拉入,但是当我在两个地方编辑时(即使编辑在不同的文件上),这会从主服务器引入所有分支并且还会产生合并冲突。

2 个答案:

答案 0 :(得分:5)

如果您的存储库的一部分管理方式不同,它应该是一个不同的存储库。

您不能同时删除对这些文件的访问权限和跟踪以及在单个存储库中维护公共历史记录。

答案 1 :(得分:4)

克隆你的回购。不要让它裸露,因为它会限制你可以用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

您现在可以提取他的更改,并在您使用的分支上重新设置它们 - 可能是一个名为“from-external”的新分支。然后,您可以将其更改合并到常规分支中。这可以从您的常规仓库完成,而不是您最初克隆的仓库。

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

不要从这里推挤,否则你可能会意外地推动其中有其他信息的分支。您可以创建另一个用户并使用不同的ssh密钥来确保只读访问此repo中的unfuddle repo。

您可以在最后一个与〜/ .ssh / config条目对应的远程命令中使用备用网址,该条目会将其映射回到虚拟网址,但会提供具有只读限制的其他密钥。

现在,当您在原始存储库中git fetch unfuddle时,您可以获得他最新的提交。如果你想为他做贡献,你需要从另一个存储库推送,这需要你再次添加遥控器 - 但要小心。

这对我来说非常有用。