gpt4 book ai didi

git - 发布私有(private) git 仓库的特定路径

转载 作者:太空狗 更新时间:2023-10-29 13:27:06 25 4
gpt4 key购买 nike

我正在与一个由约 10 名开发人员组成的团队合作开发一个包含以下项目的私有(private) gitlab 存储库:

  1. 服务器
  2. 人工智能
  3. 客户
  4. 接口(interface)
  5. 杂项(协议(protocol)、公关 Material 等)

除了 Misc 之外,每一个都有自己的 Maven 依赖项和包含在其特定文件夹中的单元测试。

我们正在使用 git-flow,所以所有的分支都将在某一时刻与一个 develop 分支 merge 。


问题:

We are currently only selling the Client & Interface with source and would like to grant our clients access to only these (sub-)projects, including their history, while being able to easily push updates and also using gitlab's issues functionality.

我的想法:

  1. 如果它是一个公共(public)仓库,我会简单地使用 git submodules,但是这个解决方案似乎不能完美地用于 private 仓库。 (如果有的话——已经阅读了很多关于无效路径的问题)
  2. 如果我有ClientInterface 的 super 干净的分支,我可以添加另一个新的remote 存储库并简单地推送这两个分支给它。这个解决方案的问题是,我们的开发人员缺乏经验,一次肮脏的推送或来自 develop 分支的一次推送基本上会使整个想法变得无用。风险太高。
  3. 我的另一个想法是将这 2 个子项目移出私有(private)存储库,在私有(private)存储库创建子模块。这在某种程度上也让人感觉很不方便,因为我们的持续集成会在不同的 repo 中运行,而且我们自己的问题也会在那里被跟踪。

由于这是一个非常具体的设置和计划,我会对您解决此类情况的想法感兴趣。感谢您的宝贵时间。

最佳答案

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

此解决方案还会发布您的项目的 git 历史记录。根据您的团队事先工作的干净程度,您可以将其过滤掉:Git Documentation on how to do this .您应该在清洁分支后执行此步骤。

这个解决方案背后的想法是......

  1. 创建 super 干净的分支,仅包括要部署的目录
  2. 然后将这些分支 pull 入一个新的仓库
  3. Control-Step 检查分支是否干净并准备好部署
  4. 部署

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

Steps to perform on 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"

Inform your fellow devs to track the new branch within their 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>

Steps to perform on new destination / deployment repository

克隆或创建 destination / deployment repository .在里面为我们的 private local repository 添加一个 Remote 并将分支 pull/merge 到主分支中:

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

git checkout master

[选项 1]:将更改直接 pull 并 merge 到 master

# Pull changes from private repo and allow unrelated histories

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

[选项 2]:在没有即时 merge 的情况下跟踪分支

# 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

关于git - 发布私有(private) git 仓库的特定路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50918212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com