Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何允许第三方开发我们git树的一部分?_Git - Fatal编程技术网

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

如何允许第三方开发我们git树的一部分?,git,Git,我们在项目中使用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

现在我有两个回购协议,我可以从每个协议中克隆和工作,但我不知道如何在主回购协议和限制回购协议之间同步更改。我尝试将其中一个作为另一个的远程添加,并从上游拉入,但这会从主节点引入所有分支,并且当我在两个位置进行编辑时(即使编辑在不同的文件上),也会产生合并冲突

如果存储库的一部分采用不同的管理方式,那么它应该是不同的存储库


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

克隆您的repo。不要将其裸露,因为这会限制您对过滤器分支的操作

git clone /c/your/path/to/repo
进行回购

cd !$:t 
失去与从中克隆的回购协议的连接

git remote rm origin
创建一个名为外部的分支

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
git push-u为外部:集成解决难题
现在,您可以将他的更改拉入,并在您使用的分支上重新设置它们的基础-可能是一个名为“from external”的新分支。然后可以将他的更改合并到常规分支中。这可以通过您的常规回购来完成,而不是您最初克隆的回购

git remote add unfuddle <url to your unfuddle repo>
git fetch unfuddle
git branch -t from-consultant unfuddle/integration
git-remote-add-unfuddle
git获取解惑
git分公司-来自咨询公司的t解决方案/整合
不要从这里推来解惑,否则您可能会意外地推一个包含其他信息的分支。您可以创建另一个用户并使用不同的ssh密钥,以确保从此repo对解模糊repo进行只读访问

您可以在最后一个远程命令中使用另一个url,该url对应于~/.ssh/config条目,该条目会将其映射回展开url,但提供具有只读限制的不同密钥

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


这在过去对我来说非常有效。

“您应该使用子模块来处理此场景”我可以获得执行此操作的确切命令吗?对于“克隆你的回购”步骤-这应该是一个裸克隆还是一个工作树克隆?到目前为止,我已经用我的方法更新了原始帖子。这与你提出的方法不同,但是如果你能为你的方法(或修正我的方法)提供命令,我很乐意使用任何一种方法。非常有用。这是我需要尽快安排的事情。我已经试过了。当我克隆复制的repo时,我只看到“master”分支,尽管git克隆的速度表明许多文件被传输了,但我似乎无法在本地找到它们(即使在进行了
git签出集成
之后,您是否也可以显示重新连接到原始repo的命令,并在新的更改中使用pull+merge?我尝试了这个方法,并立即取回了想要排除的文件。