我有一个项目正在部署到Heroku。源代码树包含一堆mp3文件(该网站将用于我参与的录制项目)。
我想在GitHub上添加源代码,但GitHub对其免费帐户有300 MB的限制。我不想在一堆mp3文件上使用50 MB的限制。显然,我可以将它们添加到.gitignore
文件中,以防止它们退出我的仓库。
但是,我使用git push heroku
部署到Heroku。我推送到Heroku的分支中必须存在mp3文件才能部署它们。
理想情况下,我想.gitignore
我本地主分支中的mp3文件,这样当我将其推送到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,但它仍然存在,所以我的项目可以使用它。
$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"
现在我已经有了一个分支,这些文件已经提交,正如我想的那样。但是,当我切换回我的主分支时,Foo.ignored就消失了。
任何人都有任何建议可以更好地设置它吗?
编辑:只是为了澄清,我希望mp3文件存在于两个分支中,这样当我在本地运行该站点(使用任一分支)时,该站点可以工作。我只想在一个分支中忽略文件,所以当我推送到GitHub时,它们也不会被推送。通常.gitignore适用于这种事情(即保留一个文件的本地副本,但不会包含在推送到遥控器中),但当我切换到签入文件的分支,然后返回到忽略文件的分支,文件消失。
答案 0 :(得分:80)
此解决方案似乎仅适用于某些已修补的git版本。有关可能有效版本的提示,请参阅a new answer pointing to workarounds和another answer and subsequent comments。
我写了一篇关于如何有效地将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
答案 1 :(得分:16)
重要提示:Cognition.Mind接受的答案不再起作用(现在已经好几年了,或者也许对于git的vanilla版本);看到评论。可在此处找到有效的答案和解决方法:
https://stackoverflow.com/a/29583813/2157640
另一种替代解决方法(针对我的特定问题,但要求手动存储操作或钩子的实现)将是git stash -u -a
。当差异很大时,这很乏味。
最后,我现在要解决的问题是将我们保存开发环境的VM分叉,并为分支设置info/excludes
,分别删除有问题的,未提交的文件/文件夹。
答案 2 :(得分:14)
我强烈建议考虑将这些MP3文件放在S3上。让它们成为你的Heroku推进的一部分(因此你的Heroku slug的一部分)将大大减慢你的dyno启动时间。由于Heroku使用EC2,如果文件在S3上并且只能由您的应用程序访问(如果用户没有直接链接到S3),您甚至不会支付任何带宽费用,只需支付50MB的费用。
答案 3 :(得分:12)
假设我们要忽略除build
分支以外的所有其他分支的production
文件夹。我们想在生产中推送build
文件夹。
1)不要在.gitignore中包含build
。如果你这样做,它将永远被忽略所有分支。
2)在exclude_from_public_viewing
内创建文件./.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
的现有文件 -
a)excludesfile = +info/exclude
以下[core]
[core]
excludesfile = +info/exclude
b)在./.git/config
的末尾创建一个新的部分
[branch "production"]
excludesfile = +info/exclude_from_public_viewing
解决方案2
有一种智能备用解决方案。假设您要在build/
分支中添加production
文件夹,并在所有其他分支中忽略它。
1)将其添加到您的gitignore
文件中。
2)在生产分支中,在执行git add
时,强制添加build
文件夹:git add -f --all build/
答案 4 :(得分:4)
您是否尝试过.gitignore在您的分支中有所不同?
只要不在该分支上跟踪文件,您就可以根据所在的分支忽略您想要的内容。
答案 5 :(得分:2)
我添加到.travis.yml
:
before_deploy:
- mv misc/.gitignore .gitignore
misc
- 任何文件夹,包含另一个.gitignore
。
mv
UNIX command移动文件;如果文件已经存在,则覆盖。
当Travis CI部署项目时,Travis CI不会推送到misc/.gitignore
中忽略的deploying provider文件和文件夹(不在原始.gitignore
来源中)。
这个答案与2018年4月有关。将来,这个答案的数据可能已经过时了。
我的real project。
Example of successful deployment
我将项目从src分支部署到同一存储库的dest分支。
我想要的是,该文件PaletteMira.suricate-profile
:
如果我正确地理解了问题的作者,他也有类似的任务。
来源分支 - 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
远程不存在于此分支中,但存在于本地。
目的地分支 - SashaDevelop
.gitignore
的一部分:
*.sublime-snippet
*.suricate-profile
不在misc/.gitignore
。
PaletteMira.suricate-profile
存在于此分支remotely和本地。
I enable PaletteMira GitHub repository for Travis CI→我set environment variable $GITHUB_TOKEN
有价值 - 我的GitHub token→我对我的src分支进行任何提交。
如果没有错误,我必须expected behavior。
答案 6 :(得分:0)
你可以从Heroku提交并推送吗?
e.g。添加音频,将它们推送到github并进入heroku,删除Heroku上工作副本上的文件。从存储库中删除音频但不从磁盘中删除音频,然后将该更改推回到github。
答案 7 :(得分:0)
Github现在支持大文件存储,请点击此处https://git-lfs.github.com/