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

628mspwn  于 2022-12-25  发布在  Git
关注(0)|答案(9)|浏览(302)

我有一个项目,我正在部署到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对这类事情工作得很好(例如,保留一个文件的本地副本,该文件不包括在到远程的推送中),但是当我切换到签入文件的分支,然后返回到忽略文件的分支时,文件消失了。

wmtdaxz3

wmtdaxz31#

这个解决方案似乎只适用于某些打过补丁的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

z3yyvxxp

z3yyvxxp2#

重要提示:Cognition公认的答案是:心智不工作了(几年前就不工作了,或者可能是git的普通版本);查看评论。有效的答案和解决方案可以在这里找到:

https://stackoverflow.com/a/29583813/2157640
另一个替代的解决方案(解决我的特定问题,但需要手动的隐藏操作或钩子的实现)是git stash -u -a,当差异很大时,这是很乏味的。
最后,我现在使用的解决方案是将我们的开发环境所在的VM分叉,并为分支适当地设置info/excludes,分别删除有问题的、未提交的文件/文件夹。

shstlldc

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

我们想忽略build文件夹,但是还没有把它添加到. gitignore文件夹中,那么git怎么知道要忽略什么呢?答案是我们把它添加到exclude文件夹中,然后有条件地把它传递给git config
5)现在,我们必须有条件地取消忽略production分支的build文件夹。要做到这一点,请执行以下操作
6)有一个名为./.git/config的现有文件,我们需要添加以下内容-
a)excludesfile = +info/exclude低于[core]

[core]
     excludesfile = +info/exclude

b)在./.git/config的末尾创建一个新部分,如下所示

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

解决方案二
有一个聪明的替代解决方案。假设你想在production分支中添加build/文件夹,并在所有其他分支中忽略它。
1)将其添加到gitignore文件中。
2)在生产分支中,执行git add时,强制添加build文件夹:git add -f --all build/

mnemlml8

mnemlml84#

我强烈建议你考虑把这些MP3文件放在S3上。把它们放在Heroku推送中(也就是Heroku slug的一部分)会大大降低你的dyno启动时间。因为Heroku使用EC2,如果这些文件在S3上,并且只被你的应用访问(如果用户没有直接链接到S3),你甚至不用支付任何带宽费用,只需要存储50MB。

vwhgwdsa

vwhgwdsa5#

你有没有试过让.gitignore在你的分支中与众不同?
您应该能够根据您所在的分支忽略您想要的内容,只要该分支上没有跟踪这些文件。

swvgeqrz

swvgeqrz6#

1.总结

1.我将Travis CI用于deployingit supports Heroku deployment
1.我在.travis.yml中添加:

before_deploy:
- mv misc/.gitignore .gitignore

其中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

  • 本地计算机-存在于所有分支,
  • src远程分支-不存在,
  • dest远程分支-存在。

如果我正确地理解了这个问题的作者的话,他也有类似的任务.

4.2源代码

源分支-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远程不存在于该分支中,而存在于本地。

4.3.目的地

目的分支-SashaDevelop
.gitignore的一部分:

*.sublime-snippet

*.suricate-profile不在misc/.gitignore中。
PaletteMira.suricate-profile存在于该分支remotely和本地。

4.4.重现步骤

    • 我为Travis CI启用PaletteMira GitHub存储库→我设置环境变量**$GITHUB_TOKEN的值-我的GitHub令牌→我对我的src分支进行任何提交。

如果没有错误,我必须获得预期行为

wfveoks0

wfveoks07#

你能从Heroku提交和推送吗?
例如:添加音频,将它们推到github和heroku中,删除Heroku上工作副本上的文件。从repo中删除音频,但不从磁盘中删除,然后将更改推回github。

g52tjvyc

g52tjvyc8#

Github现在支持大文件存储,更多信息请查看https://git-lfs.github.com/

yiytaume

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

相关问题