发布私有git存储库的某些路径

时间:2018-06-18 22:21:03

标签: git gitlab

我正与一个包含以下项目的私人gitlab存储库的约10个开发团队合作:

  1. 服务器
  2. AI
  3. 客户端
  4. 接口
  5. 杂项(协议,公关材料等)
  6. 除了 Misc 之外,其中每个都有自己的 Maven 依赖关系和单元测试包含在其特定文件夹中。

    我们正在使用git-flow,所以所有分支都会在某个时候与一个develop分支合并。

    问题:

      

    我们目前只销售客户端&界面与源,并希望我们的客户只能访问这些(子)项目,包括他们的历史记录,同时能够轻松推送更新,并使用gitlab的issues功能。

    我的想法:

    1. 如果它是一个公共回购,我只会使用git submodules,但这个解决方案似乎与私有存储库完美无缺。 (如果有的话 - 已经阅读了很多关于无效路径的问题)
    2. 如果我有ClientInterface的超级分支,我可以添加另一个新的remote存储库,只需将这两个分支推送到它。这个解决方案的问题在于,我们没有经验丰富的开发人员和一个肮脏的推动或来自develop分支的一次推送基本上会使整个想法变得毫无用处。风险太高了。
    3. 我的另一个想法是将这两个子项目移出私人仓库,在私人仓库中创建内的子模块。这在某种程度上也感觉非常不方便,因为我们的continuous integration将在不同的回购中运行,并且我们自己的问题也会被跟踪。
    4. 由于这是一个非常具体的设置和计划,我会对您的想法感兴趣,以解决这样的情况。谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

如果找到更优雅的解决方案或我们遇到麻烦,我将更新此帖子。

此解决方案还会发布您项目的git历史记录。 您可以根据自己团队的工作清洁程度进行过滤,不过:{{3} }。您应该在清洁分支后执行此步骤。

此解决方案的目的是...

  1. 创建仅包含要部署目录的超级干净分支
  2. 然后将这些分支拉到新的存储库中
  3. 控制步骤以检查分支是否干净并可以部署
  4. 部署

确保您有另一个备份并进行彻底的测试。我们在某些时候使用了force命令。这可以在 OUR 存储库上完美运行,但可能会引起我尚不了解的副作用。如果您遇到它们,请告诉我,以便我更新此条目。

  

private local repository上执行的步骤:

# Assure we are on the latest stable state within our main repo
git checkout <CURRENT_STATE>

# Create a new deployment branch from HEAD
git branch <DEPLOYMENT_BRANCH> HEAD

# Enter the new branch
git checkout <DEPLOYMENT_BRANCH>

[选项1]::如果您打算删除目录的路径结构并将所有文件部署到新存储库的根目录中,请使用以下策略

# Filter every comment outside of this subdirectory (execute from root directory of repo)
git filter-branch -f --subdirectory-filter <DIRECTORY_PATH> -- <DEPLOYMENT_BRANCH>

[选项2]:过滤并保留目录树

##
# Force filter-branch using the tree-filter (keeps the 
# directory-structure) while deleting all files outside    
# this directory (Check if you are on <DEPLOYMENT_BRANCH>
# first). Folders are kept, but since Git does not push 
# empty folders this is no problem

git filter-branch --tree-filter -f \
    'find . -path <DIRECTORY_PATH> -prune -o -type f -print0 | xargs -0 rm -f' \
    --prune-empty HEAD

我们想添加master分支的.gitignore文件。

# Take master .gitignore and add it to the branch
git checkout master -- .gitignore

您还应该更新它以忽略所有其他目录,但是您的<DIRECTORY_PATH>

##
# In .gitignore:
# Ignore everything:
*

# Except for these directories:

!path/
!path/*/
!.gitignore

阶段并提交以下更改:

git add .gitignore
git commit -m "Add .gitignore"
  

通知其他开发人员在其private local repositories中跟踪新分支:

##
# If you would pull this branch, Git would attempt a merge it into your current HEAD.
# Do NOT pull! Instead start tracking the remote branch

git checkout --track origin/<DEPLOYMENT_BRANCH>
  

在新的destination / deployment repository上执行的步骤

克隆或创建destination / deployment repository。在其中添加一个遥控器到我们的private local repository并将分支合并到主节点:

# Add remote to local private repo
git remote add local <PATH/TO/PRIVATE/REPO/.git>

git checkout master

[选项1] :拉取并因此将更改直接合并到母版中

# Pull changes from private repo and allow unrelated histories

git pull local <DEPLOYMENT_BRANCH> --allow-unrelated-histories

[选项2]:跟踪分支而不进行即时合并

# Track branches for more granular control
git checkout --track local/<DEPLOYMENT_BRANCH>
  

部署:

# Deploy option 1: (For option 2 simply push your tracked branches)
git push origin master