使用git,我如何忽略一个分支中的文件,但在另一个分支中提交?

我有一个项目,我正在部署到Heroku 。 源代码树包括一堆mp3文件(该网站将用于我大量参与的录制项目)。

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

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

理想情况下,我想.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消失了。

任何人有任何build议,以更好的方式来设置?

编辑:只是为了澄清,我希望MP3文件出现在两个分支,以便当我运行本地(使用任何分支)该网站的作品。 我只想在一个分支忽略的文件,所以当我推到GitHub他们不推。 通常.gitignore对于这种types的东西(例如保留一个文件的本地拷贝,不包含在一个推送到远程的文件中)效果很好,但是当我检入文件的时候切换到分支,然后回到分支与文件被忽略,文件消失。

此解决scheme似乎只适用于某些修补版本的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

我强烈build议考虑把这些MP3文件放在S3上。 让他们成为Heroku推动的一部分(因此也是Heroku的一部分)会大大减慢你的dyno启动时间。 由于Heroku使用EC2,如果这些文件在S3上,并且只能被你的应用程序访问(如果用户没有直接链接到S3),你甚至不会支付任何带宽费用,只收取50MB的费用。

重要提示 :Cognition.Mind接受的答案是不行的(现在已经好几年了,或者也许是对于git的香草版本)。 看到评论。 有效的答案和解决方法可以在这里find:

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

另一个替代解决方法(为我的特定问题工作,但要求手动存储操作或实现一个钩子)将是git stash -u -a 。 当差异很大时,这是乏味的。

最后,我现在要解决的解决scheme是把我们的虚拟机分成我们的开发环境,并为分支设置适当的info/excludes ,分别删除违规的,未提交的文件/文件夹。

假设我们想忽略production分支以外的所有其他分支的production文件夹。 正如我们要推动生产中的生成文件夹。

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

2)在./.git/info (这个文件夹已经存在)文件夹里面创build一个文件exclude_from_public_viewing touch ./.git/info/exclude_from_public_viewing

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

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

  build 

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

5)现在我们必须有条件地取消production分支的production文件夹。 要做到这一点以下

6)有一个名为./.git/config的现有文件,我们需要添加以下内容 –

a) excludesfile = +info/exclude below [core]

 [core] excludesfile = +info/exclude 

b)在./.git/config结尾处创build一个新节

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

解决scheme2

有一个聪明的替代解决scheme。 比方说,你想在production早午餐中添加生成build/文件夹,并忽略所有其他分支。

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

2)在生产早午餐时,做git add,强制添加生成文件夹git add -f --all build/

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

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

Github现在已经支持大文件存储,详情见https://git-lfs.github.com/

你可以从Heroku承诺和推动吗?

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