发布私有git存储库的特定路径

5
我和一个团队中的10个开发人员一起在一个私有的 GitLab 仓库上工作,里面包含以下项目:
  1. 服务器
  2. AI
  3. 客户端
  4. 界面
  5. 其他(协议、公共关系材料等)
除了"其他"之外,每个项目都有自己的 Maven 依赖和单元测试,它们被包含在各自的文件夹中。我们使用 git-flow,在某个时间点上所有分支将与一个 develop 分支合并。
问题: 我们目前只销售具有源代码的“客户端”和“界面”,并希望授予我们的客户对这些(子)项目的访问权限,以及它们的历史记录,并能够轻松地推送更新并使用 GitLab 的问题功能。
我想到的解决方案: 1. 如果这是一个公共存储库,我会简单地使用 git 子模块,但是这种解决方法似乎无法与私有存储库无缝配合使用。(如果能用的话——我已经阅读了很多关于路径无效的问题) 2. 如果我为“客户端”和“界面”创建了超级干净的分支,我可以添加另一个全新的远程存储库,然后简单地将这两个分支推送到它。但是这个解决方案的问题在于,我们有没有经验的开发人员加入进来,一个不干净的推送或来自“develop”分支的推送就会使整个想法无用。风险太高了。 3. 我还有另一个想法,将这两个子项目从私有存储库中移出,在私有存储库中创建子模块。但这种方式似乎也相当不方便,因为我们的持续集成将在不同的存储库中运行,而且我们自己的问题也将在那里跟踪。
因为这是一个非常具体的设置和计划,所以我很想听听您的想法来解决这种情况。谢谢您的时间。
1个回答

0

如果找到更优雅的解决方案或遇到问题,我会更新这篇文章。

此解决方案还会发布您项目的git历史记录。根据您的团队之前的工作情况,您可以将其过滤掉:Git文档如何执行此操作。在清理分支后,应执行此步骤。

此解决方案的想法是...

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

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

私有本地存储库上执行的步骤:

# 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"

请通知你的同事在他们的私有本地仓库中跟踪新分支:
##
# 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>

新的“目标/部署存储库”的操作步骤是:
克隆或创建“目标/部署存储库”。在其中添加一个到我们的“私有本地存储库”的远程仓库,并拉取/合并分支至主分支:
# 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>

Deployment:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接