我有一个项目,我正在部署到Heroku。源代码树包括一堆mp3文件(该网站将为一个录音项目,我是大量参与)。
我想把它的源代码放在GitHub上,但是GitHub的免费账户有300MB的限制,我不想把我的50MB限制用在一堆mp3文件上,显然,我可以把它们添加到.gitignore
文件中,这样我就不会把它们放在我的repo中了。
然而,我使用git push heroku
部署到Heroku。MP3文件必须存在于我推送到Heroku的分支中,以便它们得到部署。
理想情况下,我会将本地master分支中的mp3文件.gitignore
,这样当我将其推送到GitHub时,mp3就不会被包含在内。然后我会保留一个本地production分支,该分支提交而不是忽略mp3。要进行部署,我会将master合并到production中,然后将production分支推送到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"
现在我已经有了一个分支来提交这些文件,但是,当我切换回master分支时,foo.ignored不见了。
有人有更好的方法来设置这个吗?
编辑:只是为了澄清,我希望的mp3文件,以目前在两个分支,以便当我运行本地网站(使用任一分支)站点工作正常。我只想忽略一个分支中的文件,这样当我推送到GitHub时,它们也不会被推送。通常. gitignore对这类事情工作得很好(例如,保留一个文件的本地副本,该文件不包括在到远程的推送中),但是当我切换到签入文件的分支,然后返回到忽略文件的分支时,文件消失了。
9条答案
按热度按时间wmtdaxz31#
这个解决方案似乎只适用于某些打过补丁的git版本,请参阅a new answer pointing to workarounds和another answer and subsequent comments以了解哪些版本可以工作。
我写了一篇博文,讨论如何有效地将
excludesfile
用于不同的分支,比如一个用于公共github,一个用于heroku部署。下面是快速和肮脏的:
然后在.git/config文件中添加以下行:
现在,所有全局忽略的内容都在
info/exclude
文件中,特定于分支的内容在info/exclude_from_public_viewing
文件中http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches
z3yyvxxp2#
重要提示:Cognition公认的答案是:心智不工作了(几年前就不工作了,或者可能是git的普通版本);查看评论。有效的答案和解决方案可以在这里找到:
https://stackoverflow.com/a/29583813/2157640
另一个替代的解决方案(解决我的特定问题,但需要手动的隐藏操作或钩子的实现)是
git stash -u -a
,当差异很大时,这是很乏味的。最后,我现在使用的解决方案是将我们的开发环境所在的VM分叉,并为分支适当地设置
info/excludes
,分别删除有问题的、未提交的文件/文件夹。shstlldc3#
假设我们想忽略
build
文件夹从所有其他分支除了production
分支。因为我们想把build
文件夹在生产。1)不要在. gitignore中包含
build
。如果你这样做,它将在所有分支中被忽略。2)在
./.git/info
(此文件夹已存在)文件夹touch ./.git/info/exclude_from_public_viewing
中创建文件exclude_from_public_viewing
3)在
exclude_from_public_viewing
内写入一行(因为您尝试忽略所有分支的build
)。!build
4)存在一个现有的文件
.git/info/exclude
。我们需要在其中添加以下行。我们想忽略
build
文件夹,但是还没有把它添加到. gitignore文件夹中,那么git怎么知道要忽略什么呢?答案是我们把它添加到exclude
文件夹中,然后有条件地把它传递给git config
5)现在,我们必须有条件地取消忽略
production
分支的build
文件夹。要做到这一点,请执行以下操作6)有一个名为
./.git/config
的现有文件,我们需要添加以下内容-a)
excludesfile = +info/exclude
低于[core]
b)在
./.git/config
的末尾创建一个新部分,如下所示解决方案二
有一个聪明的替代解决方案。假设你想在
production
分支中添加build/
文件夹,并在所有其他分支中忽略它。1)将其添加到
gitignore
文件中。2)在生产分支中,执行
git add
时,强制添加build
文件夹:git add -f --all build/
mnemlml84#
我强烈建议你考虑把这些MP3文件放在S3上。把它们放在Heroku推送中(也就是Heroku slug的一部分)会大大降低你的dyno启动时间。因为Heroku使用EC2,如果这些文件在S3上,并且只被你的应用访问(如果用户没有直接链接到S3),你甚至不用支付任何带宽费用,只需要存储50MB。
vwhgwdsa5#
你有没有试过让.gitignore在你的分支中与众不同?
您应该能够根据您所在的分支忽略您想要的内容,只要该分支上没有跟踪这些文件。
swvgeqrz6#
1.总结
1.我将Travis CI用于deploying(it supports Heroku deployment)
1.我在
.travis.yml
中添加:其中
misc
-任何文件夹,包含另一个.gitignore
。移动文件;覆盖,如果文件已经存在。
当Travis CI部署项目时,Travis CI不会将
misc/.gitignore
中忽略的文件和文件夹(不在源的原始.gitignore
中)推送到部署提供程序。2.局限性
1.这个答案可能不适合作者的所有情况,但是这个答案回答了"使用git,我如何忽略一个分支中的文件,而在另一个分支中提交它?"
1.我不是Heroku用户,我的例子是GitHub,不是Heroku。这个答案的数据在GitHub中对我有效,但可能在Heroku上无效。
3.相关性
此答案与2018年4月相关,未来此答案的数据可能会过时。
4.演示
我的real project。
4.1任务
我将项目从同一个存储库的src分支部署到dest分支。
我想要,那个文件
PaletteMira.suricate-profile
:如果我正确地理解了这个问题的作者的话,他也有类似的任务.
4.2源代码
源分支-SashaYAML。
.travis.yml
的一部分:.gitignore
的一部分:misc/.gitignore
的一部分*.suricate-profile
不在misc/.gitignore
中。PaletteMira.suricate-profile
远程不存在于该分支中,而存在于本地。4.3.目的地
目的分支-SashaDevelop
.gitignore
的一部分:*.suricate-profile
不在misc/.gitignore
中。PaletteMira.suricate-profile
存在于该分支remotely和本地。4.4.重现步骤
$GITHUB_TOKEN
的值-我的GitHub令牌→我对我的src分支进行任何提交。如果没有错误,我必须获得预期行为。
wfveoks07#
你能从Heroku提交和推送吗?
例如:添加音频,将它们推到github和heroku中,删除Heroku上工作副本上的文件。从repo中删除音频,但不从磁盘中删除,然后将更改推回github。
g52tjvyc8#
Github现在支持大文件存储,更多信息请查看https://git-lfs.github.com/
yiytaume9#
原来的问题是一个小命令,但我遇到了它,因为我刚刚写了一个关于它的medium article,我想这可能会帮助一些人。
我个人已经通过husky用Git hooks解决了这个问题-似乎是最简单和最可靠的解决方案。
显然,我建议阅读这篇文章,但这里有重现的步骤
*步骤1:
yarn add -D husky && yarn husky install
*步骤2:
yarn husky add .husky/post-checkout
*步骤3:
mkdir .husky/gitignores && cp .gitignore .husky/gitignores
*步骤4:
touch .husky/gitignores/.gitignore_husky
***步骤5:**将this gist content复制并粘贴到
.husky/post-checkout
中