如何防止GitHub Action从私有仓库泄露到公有仓库?
你的场景我太懂了——既要在私有仓库保留Action做构建,又不想合并到公有仓库时带过去导致无用触发。先给你明确一点:用.gitignore是没用的,因为.gitignore只针对未被Git跟踪的文件,而你的Action文件已经在私有master分支被跟踪了,合并时Git肯定会把它同步到公有仓库。
下面给你三个靠谱的解决方案,你可以根据自己的习惯选:
方案1:给Action加仓库判断条件(最省心)
不需要改合并流程,直接在你的Action配置文件(.github/workflows/xxx.yml)里加个判断,让它只在私有仓库触发运行。
比如在触发器里加条件:
on: push: branches: [ master ] if: github.repository == '你的用户名/私有仓库名'
或者在job层面加判断(更灵活,比如某些步骤可以跳过):
jobs: build: runs-on: ubuntu-latest # 只有私有仓库才执行这个job if: github.repository == '你的用户名/私有仓库名' steps: - uses: actions/checkout@v4 # ... 你的其他构建步骤
这样就算不小心把Action文件合并到公有仓库,它也不会触发运行,自然不会有构建失败和资源浪费的问题。这个方案最简单,不用调整你的分支合并习惯。
方案2:用.gitattributes指定合并策略
在私有仓库的根目录创建(或修改).gitattributes文件,给你的Action文件设置merge=ours策略:
.github/workflows/你的action.yml merge=ours
这个策略的意思是:当你从公有仓库合并更新到私有master时,保留私有仓库里的Action文件;而当你把私有master合并到公有master时,公有仓库会忽略这个文件(因为公有仓库原本没有它,ours策略会让合并后公有仓库依然不包含这个文件)。
需要注意的是,这个方法需要确保公有仓库一开始就没有这个Action文件,否则后续合并可能需要手动处理冲突,但对你的场景来说应该没问题。
方案3:调整分支策略,隔离Action文件
如果不想让Action文件出现在私有master分支里,可以在私有仓库单独建一个分支(比如action-enabled),把Action文件放在这个分支上,然后让你的开发分支基于master + action-enabled的组合分支进行开发。
当需要合并到公有仓库时,你只合并私有仓库的master分支,不合并action-enabled分支,这样公有仓库就不会拿到Action文件。不过这个方案需要调整你的日常开发流程,适合对分支管理比较熟悉的情况。
内容的提问来源于stack exchange,提问作者unsafe_where_true

