174

我有一个要部署到Heroku的项目。源代码树包含一堆 mp3 文件(该网站将用于我参与的一个录音项目)。

我想把它的源代码放在GitHub 上,但是 GitHub 对他们的免费帐户有 300 MB 的限制。我不想在一堆 mp3 文件上使用 50 MB 的限制。显然,我可以将它们添加到.gitignore文件中以将它们排除在我的存储库之外。

但是,我使用git push heroku. mp3 文件必须存在于我推送到 Heroku 的分支中,以便它们被部署。

理想情况下,我想.gitignore将 mp3 文件放在我的本地 master 分支中,这样当我将其推送到 GitHub 时,不包括 mp3。然后我会保留一个提交而不是忽略 mp3 的本地生产分支。要部署,我会将 master 合并到生产中,然后将生产分支推送到 Heroku。

我无法让它正常工作。

这是我正在尝试做的一个例子......

$ git init git-ignore-test
$ cd git-ignore-test
$ echo "*.ignored" >> .gitignore
$ git add .gitignore && git commit -m "Ignore .ignored files"
$ touch Foo.ignored

此时, Foo.ignored 在我的 master 分支中被忽略了,但它仍然存在,所以我的项目可以使用它。

$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"

现在我有一个提交了这些文件的分支,正如我所愿。但是,当我切换回我的主分支时, Foo.ignored 消失了。

有人对更好的设置方法有任何建议吗?

编辑:为了澄清,我希望 mp3 文件出现在两个分支中,以便当我在本地运行站点(使用任一分支)时,站点可以正常工作。我只想在一个分支中忽略文件,所以当我推送到 GitHub 时,它们也不会被推送。通常 .gitignore 对这种事情很有效(即保留一个不包含在推送到远程的文件的本地副本),但是当我切换到签入文件的分支时,然后返回忽略文件的分支,文件消失。

4

8 回答 8

85

此解决方案似乎仅适用于某些已修补的 git 版本。请参阅指向解决方法的新答案以及另一个答案和后续评论,以提示哪些版本可能有效。

我写了一篇关于如何有效地excludesfile为不同分支使用的博客文章,比如一个用于公共 github 和一个用于 heroku 部署。

这是快速和肮脏的:

$ git branch public_viewing
$ cd .git/
$ touch info/exclude_from_public_viewing
$ echo "path/to/secret/file" > info/exclude_from_public_viewing 

然后在 .git/config 文件中添加以下行:

[core]
excludesfile = +info/exclude


[branch "public_viewing"]
excludesfile = +info/exclude_from_public_viewing

现在所有全局忽略的东西都在info/exclude文件中,特定的分支在info/exclude_from_public_viewing

希望有帮助!

http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches

于 2010-10-28T15:26:11.303 回答
24

重要提示:Cognition.Mind 接受的答案不起作用(现在已经有好几年了,或者可能是 git 的香草版本);见评论。可以在此处找到有效的答案和解决方法:

https://stackoverflow.com/a/29583813/2157640

另一种替代解决方法(针对我的特定问题,但需要手动存储操作或实现挂钩)是git stash -u -a. 当差异很大时,这很乏味。

最后,我现在采用的解决方案是分叉我的虚拟机,我们在其中保存我们的开发环境,并info/excludes为分支进行适当的设置,分别删除有问题的、未提交的文件/文件夹。

于 2016-09-01T20:31:29.937 回答
16

假设我们要忽略build除 branch 之外的所有其他分支的文件夹production。因为我们想build在生产中推送文件夹。

1)不要包含build在 .gitignore 中。如果您这样做,它将始终被所有分支忽略。

exclude_from_public_viewing2)在./.git/info(此文件夹已存在)文件夹中创建一个文件touch ./.git/info/exclude_from_public_viewing

3)在里面exclude_from_public_viewing写一行(因为你试图忽略build所有的分支)。 !build

4)有一个现有的文件.git/info/exclude。我们需要在其中添加以下行。

 build

我们想忽略build文件夹,但没有在 .gitignore 中添加它。那么 git 如何知道要忽略什么?答案是我们将它添加到exclude文件并有条件地将该文件传递给git config

5)现在我们必须有条件地取消忽略分支build的文件夹。production执行以下操作

6)有一个名为./.git/config我们需要添加的现有文件 -

一)excludesfile = +info/exclude下面[core]

[core]
     excludesfile = +info/exclude

./.git/configb) 在as的末尾创建一个新部分

[branch "production"]
    excludesfile = +info/exclude_from_public_viewing

解决方案 2

有一个聪明的替代解决方案。假设您想在分支中添加build/文件夹production并在所有其他分支中忽略它。

1)将其添加到您的gitignore文件中。

2)在生产分支,同时做git add,强制添加build文件夹:git add -f --all build/

于 2016-09-02T05:46:42.777 回答
14

我强烈建议考虑将这些 MP3 文件放在 S3 上。让它们成为 Heroku 推送的一部分(因此也是 Heroku slug 的一部分)将大大减慢您的测功机启动时间。由于 Heroku 使用 EC2,如果文件在 S3 上并且只能由您的应用程序访问(如果用户没有直接链接到 S3),您甚至不需要支付任何带宽费用,只需存储 50MB 的费用。

于 2009-12-09T20:27:43.180 回答
5

Have you tried having .gitignore be different in your branch?

You should be able to ignore what you want based on the branch you are in as long as the files are not tracked on that branch.

于 2009-12-03T18:03:15.730 回答
4

一、总结

  1. 我使用Travis CI进行部署 它支持 Heroku 部署
  2. 我添加到我的.travis.yml

    before_deploy:
    - mv misc/.gitignore .gitignore
    

    Where misc— 任何文件夹,包含另一个.gitignore.

    mvUNIX 命令移动文件;覆盖,如果文件已经存在。

Travis CI 部署项目时,Travis CI 不会推送部署提供程序文件和文件夹,这些文件和文件夹会被忽略misc/.gitignore(不在.gitignore源代码的原始文件中)。


2. 限制

  1. 这个答案可能并不适合作者的所有条件。但是这个答案回答了“使用 git,我如何忽略一个分支中的文件但将其提交到另一个分支?”的问题?</li>
  2. 我不是 Heroku 用户,我的示例是GitHub的,而不是 Heroku 的。此答案的数据在 GitHub 中适用于我,但可能不适用于 Heroku。

3. 相关性

此答案与 2018 年 4 月相关。将来,此答案的数据可能已过时。


4. 示范

真正的项目

成功部署示例

4.1。任务

我将我的项目从 src 分支部署到同一存储库的 dest 分支。

我想要那个文件PaletteMira.suricate-profile

  • 本地机器——存在于所有分支中,
  • src 远程分支——不存在,
  • dest 远程分支 - 存在。

如果我正确理解了问题的作者,他有类似的任务。

4.2. 源代码

来源分支 - SashaYAML

部分.travis.yml

before_deploy:
- mv misc/.gitignore .gitignore

deploy:
  provider: pages
  on:
    branch: SashaYAML
  keep-history: true
  skip-cleanup: true
  target-branch: SashaDevelop
  repo: Kristinita/PaletteMira
  github-token: $GITHUB_TOKEN
  committer-from-gh: true
  project-name: PaletteMira
verbose: true

部分.gitignore

*.sublime-snippet
*.suricate-profile

部分misc/.gitignore

*.sublime-snippet

*.suricate-profile不在misc/.gitignore

PaletteMira.suricate-profile远程不在此分支中,但在本地存在。

4.3. 目的地

目的地分支——SashaDevelop

部分.gitignore

*.sublime-snippet

*.suricate-profile不在misc/.gitignore

PaletteMira.suricate-profile远程和本地存在此分支。

4.4. 重现步骤

我为 Travis CI 启用 PaletteMira GitHub 存储库→ 我使用值设置环境变量 $GITHUB_TOKEN— 我的GitHub 令牌→ 我对我的 src 分支进行任何提交。

如果没有错误,我必须得到预期的行为

于 2018-04-24T07:50:17.423 回答
0

你可以从 Heroku 提交和推送吗?

例如添加音频,将它们推送到 github 并进入 heroku,删除 Heroku 工作副本上的文件。从 repo 中删除音频,但不从磁盘中删除,然后将该更改推送回 github。

于 2009-12-05T01:43:47.600 回答
0

Github 现在支持大文件存储,请在此处查看更多信息https://git-lfs.github.com/

于 2016-07-13T13:47:17.473 回答