2009-12-02 237 views
117

我有一个项目,我正在部署到Heroku。源代码树包括一堆mp3文件(该网站将用于我参与其中的录制项目)。使用git,我如何忽略一个分支中的文件,但让它在另一个分支中提交?

我想将它的源代码放在GitHub上,但GitHub的免费帐户有300 MB的限制。我不想在一堆mp3文件上使用50 MB的限制。很显然,我可以将它们添加到.gitignore文件中,以防止它们出现在我的回购站中。

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

理想情况下,我想.gitignore我的本地主分支中的MP3文件,以便当我推到GitHub时,MP3不包括在内。然后,我会保留一个本地生产分支,承诺mp3而不是忽略。为了部署,我将主人合并到生产中,然后将生产分支推送到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

为什么MP3文件* *永远需要被提交到库? – 2009-12-03 02:34:30

+4

使用heroku,提交回购是在部署时获取应用程序中包含的文件的唯一方法。唯一的选择是使用类似亚马逊S3的服务MP3,但我宁愿避免这种情况。 – 2009-12-03 02:40:57

+0

这听起来像是你跳过美元来节省便士...... Rackspace Cloud非常容易安装,并且在那里存储<1 GB的文件花费很少...... – gahooa 2009-12-09 20:31:17

回答

71

此解决方案似乎只适用于某些修补版本的git。请参阅a new answer pointing to workaroundsanother 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

+0

太棒了。我从来没有新的'excludedesfile'。谢谢! – 2010-10-29 16:01:26

+2

这是为你工作吗迈伦?我无法让它工作。谢谢。 – 2011-04-29 07:45:04

+1

对不起,花了这么久..但如果你不删除.gitignore文件,它将默认为那些第一。 – 2011-08-07 07:28:16

2

你有没有试过让.gitignore在你的分支中有所不同?

只要未在该分支上跟踪文件,您就应该能够根据您所在的分支忽略您想要的内容。

+5

我试过了,如果你看看通讯我在上面张贴你会看到,这正是我所做的。问题是,当我从分支转换到分支文件被忽略的文件时,git放弃了这些文件。我希望将mp3保存在我的主分支中,以便在开发模式下正常工作,即使文件被忽略。 – 2009-12-03 19:00:03

+0

他已经说过他做了什么。也许只是删除这个答案可能是最好的:-)它会造成分心。 – blamb 2016-11-08 00:35:10

0

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

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

13

我强烈建议考虑将这些MP3文件放在S3上。让它们成为你的Heroku推力的一部分(并因此成为你的Heroku弹头的一部分)将大大减缓你的dyno启动时间。由于Heroku使用EC2,如果文件位于S3并且只能由您的应用程序访问(如果用户不直接与S3连接),您甚至不会支付任何带宽费用,只需支付50MB的费用。

12

重要提示:由Cognition.Mind接受的答案不工作(了,几年来,或者也许是git的香草版本);看到评论。一个有效的答案和解决方法可以在这里找到:

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

另一种替代的解决方法(工作对我特别的问题,但苛刻的手工藏操作或执行挂钩的)会git stash -u -a。当差异很大时,这很乏味。

最后,我现在要解决的解决方案是分叉我的虚拟机,我们把我们的开发环境放入其中,并分别为分支设置info/excludes,分别删除违规的,未提交的文件/文件夹。

7

假设我们想忽略除production分支之外的其他所有分支的build文件夹。正如我们想推动生产中的build文件夹一样。

1)不包括在.gitignore中的build。如果你这样做,它将永远被所有分支忽略。

2)里面创建exclude_from_public_viewing写一行内./.git/info文件exclude_from_public_viewing(此文件夹已经存在)的文件夹touch ./.git/info/exclude_from_public_viewing

3)(当你试图忽略build为所有分支)。 !build

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

build 

我们要忽略build文件夹,但在的.gitignore还没有添加它。那么git怎么知道要忽略什么呢?答案是,我们将它添加到exclude文件和有条件该文件传递到git config

5)现在我们要有条件地屏蔽了production分支build文件夹。要做到这一点执行以下

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

一)excludesfile = +info/exclude低于[core]

[core] 
    excludesfile = +info/exclude 

B)创建的最后一个新的部分./.git/config作为

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

解决方案2

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

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

2)在生产早午餐,一边做git的增加,迫使加build文件夹git add -f --all build/

+0

看起来很有希望。 +1 – VonC 2016-09-02 06:52:40

+0

这与接受的解决方案有何不同?你测试过哪个版本的git?由于链接答案表明它失败,因为不支持'分支。 .excludesfile' in git(不再?),只对'core.excludesfile',我自己的测试似乎证实了这一点。 – Murphy 2016-09-02 08:15:25

+0

@murphy它可以正常使用'git版本2.7.4(Apple Git-66)',我还没有使用过'分支。 .excludesfile'在我的解决方案中。 – sapy 2016-09-02 08:43:10

相关问题