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

Myr*_*ton 152 git gitignore

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

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

但是,我使用了部署到Heroku git push 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
Run Code Online (Sandbox Code Playgroud)

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

$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"
Run Code Online (Sandbox Code Playgroud)

现在我有了一个分支,这些文件已经提交,正如我想的那样.但是,当我切换回我的主分支时,Foo.ignored就消失了.

有人有任何建议可以更好地设置它吗?

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

小智 81

此解决方案似乎仅适用于某些已修补的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 
Run Code Online (Sandbox Code Playgroud)

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

[core]
excludesfile = +info/exclude


[branch "public_viewing"]
excludesfile = +info/exclude_from_public_viewing
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助!

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

  • 此解决方案不起作用.博客上有一些讨论,也没有人能够做到这一点. (33认同)
  • 相关:[我对这个解决方案的SO问题的答案不起作用](http://stackoverflow.com/a/29583813/2157640) (10认同)
  • 即使项目不使用.gitignore,这对我也不起作用.你介意提供从头开始设置这些命令的成绩单(`git init`,...),以及你使用的Git版本吗? (3认同)
  • 这对你有用Myron吗?我不能让它发挥作用.谢谢. (2认同)
  • 在香草Git,我很确定这不起作用,从来没有.那些设法重现这一点的人,您可以在您的环境中分享您的Git版本和其他相关信息吗?也许你的发行版的Git包维护者有一个补丁版本. (2认同)

Mur*_*phy 18

重要提示:Cognition.Mind接受的答案不起作用(现在已经好几年了,或者也许对于git的vanilla版本); 看到评论.可在此处找到有效的答案和解决方法:

/sf/answers/2070866941/

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

最后,我现在要解决的问题是将我们的VM保存在我们的开发环境中,并info/excludes为分支进行适当设置,分别删除有问题的,未提交的文件/文件夹.


Dav*_*lar 14

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


sap*_*apy 12

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

[core]
     excludesfile = +info/exclude
Run Code Online (Sandbox Code Playgroud)

b)在./.git/configas 的末尾创建一个新的部分

[branch "production"]
    excludesfile = +info/exclude_from_public_viewing
Run Code Online (Sandbox Code Playgroud)

解决方案2

有一个智能备用解决方案.假设你想build/production早午餐中添加文件夹并在所有其他分支中忽略它.

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

2)在生产早午餐时,在执行git add时,强制添加git add文件夹build

  • @sapy:我根据OP的用例尝试了这个,当我从生产切换到master时,文件仍然消失.请注意,"build"文件夹应该提交到"production"分支.(另外,我注意到如果我不在"生产"分支中提交"build"文件夹,则"生产"分支会忽略"build"文件夹的存在 - 即,[branch"production"]排除文件配置.不行.我使用与你的完全相同的git版本.我还尝试了[分支"生产"]方法,只在生产分支中使用*ignore*文件,它也不起作用,就像墨菲说的那样. (4认同)
  • 这与公认的解决方案有何不同?你用哪个版本的 git 测试过?正如链接的答案指出的那样,它失败了,因为 git 中不支持 `branch.<name>.excludesfile` (不再?),仅支持 `core.excludesfile`,而我自己的测试似乎证实了这一点。 (2认同)

kEN*_*END 5

您是否尝试过让 .gitignore 在您的分支中有所不同?

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

  • 我试过了。如果您查看我上面发布的命令,您会发现这正是我所做的。问题是,当我从签入文件的分支切换到忽略文件的分支时,git 会丢弃这些文件。我想将 mp3 保留在我的主分支中,以便站点在开发模式下正常工作,即使文件被忽略。 (6认同)