Git:在推送事件时管理文件
Git: managing files on push event
我有一个包含 LaTeX 项目的存储库,其中包含从 .tex 文件编译和生成的 .pdf。我希望历史和源文件是私有的,但 .pdf 应该是 public 并且固定 URL。 GitHub 本身为单个文件提供了一个固定的 URL 但为了使其 public 可用我需要设置存储库 public 这也暴露了历史和所有其他文件到 public.
你认为有什么方法可以让 GitHub(或 BitBucket,或...)将单个 .pdf 文件推送到其他地方,以便它具有固定的唯一性和 public URL?我想我可以以某种方式将它推送到 AWS 的 S3 或让 Lambda 接收 HTTP 调用并获取单个文件,但我不知道可能有更简单的方法。
继续 Max 的回答,一种解决方案可能是维护单独的私有和 public 回购协议。我喜欢这个选项,因为您不必引入其他服务。您的工作流程可能如下所示:
- 在您的私人存储库中本地编译您的 PDF
- 将更改提交到您的私有存储库
- 有一个 post-commit git 钩子将编译后的 PDF 复制到本地 public 存储库
- 从您的本地 public 仓库推送到 Github
对于 post-commit 挂钩,在 git .git/hooks
目录中创建一个名为 post-commit
(无扩展名)的文件。然后只需在该文件中放置一个 bash 命令,将 PDF 从私人仓库复制到 public 仓库,例如:cp ~/private-repo/document.pdf ~/public-repo/document.pdf
.
您可以在私有存储库上使用 GitHub 页面来实现此目的。来自 the documentation:
GitHub Pages sites are publicly available on the internet, even if their repositories are private.
您可以将代码提交到 master
分支并使用 CI 工具 运行 构建步骤,强制删除源文件并将 PDF 全部提交到 gh-pages
分支。如果这是一个用户页面(例如 username.github.io 存储库),那么同样适用,但是 GitHub 页面是从 master
分支构建的,所以你需要使用类似 release
供你的构建工具收听的分支。
我用一个similar workflow to build a PDF from a .tex file using Travis. The source is public, but the workflow would work for a private repository. The only problem with this is that Travis public version cannot work on private repositories, but Travis Pro and other tools like CircleCI可以做到这一点
好的,这就是我的解决方法(非常感谢@cmbuckley 为我指明了正确的方向)。
我在存储库中使用 TeX 项目创建了一个非常简单的 index.html 文件:
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
</body>
</html>
<script>
$(document).ready(function() {
var link=document.createElement('a');
link.href = "EXISTING_FILE_NAME";
link.download = "NEW_FILENAME";
link.click();
});
</script>
然后我设置存储库来为 git-page 的 master
分支提供服务。然后我使用我自己的域并在 CloudFlare 上创建了一个子域,它拥有我域的名称服务器,将它指向我的 GitHub 页面,并设置
存储库中与我的自定义域地址相同的子域。
现在发生的事情是这样的:用户进入自定义子域,他得到 index.html 页面,该页面自动下载最新版本的文件,因为它是提供的文件。然而存储库是私有的,甚至文件的名称都被更改,因此没有人看到它。
我有一个包含 LaTeX 项目的存储库,其中包含从 .tex 文件编译和生成的 .pdf。我希望历史和源文件是私有的,但 .pdf 应该是 public 并且固定 URL。 GitHub 本身为单个文件提供了一个固定的 URL 但为了使其 public 可用我需要设置存储库 public 这也暴露了历史和所有其他文件到 public.
你认为有什么方法可以让 GitHub(或 BitBucket,或...)将单个 .pdf 文件推送到其他地方,以便它具有固定的唯一性和 public URL?我想我可以以某种方式将它推送到 AWS 的 S3 或让 Lambda 接收 HTTP 调用并获取单个文件,但我不知道可能有更简单的方法。
继续 Max 的回答,一种解决方案可能是维护单独的私有和 public 回购协议。我喜欢这个选项,因为您不必引入其他服务。您的工作流程可能如下所示:
- 在您的私人存储库中本地编译您的 PDF
- 将更改提交到您的私有存储库
- 有一个 post-commit git 钩子将编译后的 PDF 复制到本地 public 存储库
- 从您的本地 public 仓库推送到 Github
对于 post-commit 挂钩,在 git .git/hooks
目录中创建一个名为 post-commit
(无扩展名)的文件。然后只需在该文件中放置一个 bash 命令,将 PDF 从私人仓库复制到 public 仓库,例如:cp ~/private-repo/document.pdf ~/public-repo/document.pdf
.
您可以在私有存储库上使用 GitHub 页面来实现此目的。来自 the documentation:
GitHub Pages sites are publicly available on the internet, even if their repositories are private.
您可以将代码提交到 master
分支并使用 CI 工具 运行 构建步骤,强制删除源文件并将 PDF 全部提交到 gh-pages
分支。如果这是一个用户页面(例如 username.github.io 存储库),那么同样适用,但是 GitHub 页面是从 master
分支构建的,所以你需要使用类似 release
供你的构建工具收听的分支。
我用一个similar workflow to build a PDF from a .tex file using Travis. The source is public, but the workflow would work for a private repository. The only problem with this is that Travis public version cannot work on private repositories, but Travis Pro and other tools like CircleCI可以做到这一点
好的,这就是我的解决方法(非常感谢@cmbuckley 为我指明了正确的方向)。
我在存储库中使用 TeX 项目创建了一个非常简单的 index.html 文件:
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
</body>
</html>
<script>
$(document).ready(function() {
var link=document.createElement('a');
link.href = "EXISTING_FILE_NAME";
link.download = "NEW_FILENAME";
link.click();
});
</script>
然后我设置存储库来为 git-page 的 master
分支提供服务。然后我使用我自己的域并在 CloudFlare 上创建了一个子域,它拥有我域的名称服务器,将它指向我的 GitHub 页面,并设置
存储库中与我的自定义域地址相同的子域。
现在发生的事情是这样的:用户进入自定义子域,他得到 index.html 页面,该页面自动下载最新版本的文件,因为它是提供的文件。然而存储库是私有的,甚至文件的名称都被更改,因此没有人看到它。