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

我有个项目要部署到 你好。源代码树包括一组 mp3文件(该网站将是一个录音项目,我深入参与)。

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

然而,我使用 git push heroku部署到 Heroku。Mp3文件必须存在于我推送到 Heroku 的分支中,这样它们才能得到部署。

理想情况下,我希望在我的本地主分支中将 mp3文件 .gitignore,这样当我将其推送到 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.Igore,但是它仍然存在,因此我的项目可以使用它。

$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"

现在我有了一个分支,可以随心所欲地提交这些文件。然而,当我切换回我的主分支时,Foo.邻居就消失了。

有人有更好的建议吗?

编辑: 只是澄清一下,我希望 mp3文件在两个分支中都存在,这样当我在本地运行站点时(使用任何一个分支)站点都能正常工作。我只希望在一个分支中忽略这些文件,这样当我推到 GitHub 时,它们也不会被推到。通常是这样。Gitignore 在这种情况下工作得很好(例如,保留一个文件的本地副本,这个文件没有包含在一个远程推送中) ,但是当我切换到签入文件的分支,然后回到忽略文件的分支时,文件就会消失。

92548 次浏览

你有没有试过在你的分公司里让. gitignore 与众不同?

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

你能从 Heroku 下手吗?

例如,添加音频,把它们推到 github 和 Heroku,删除 Heroku 上工作副本上的文件。从回购中删除音频,但不要从磁盘中删除,然后将更改推回到 github。

我强烈建议考虑把那些 MP3文件放在 S3上。将它们作为 Heroku 推送的一部分(因此也是 Heroku 蛞蝓的一部分)将大大减慢你的动态启动时间。因为 Heroku 使用 EC2,如果文件在 S3上,并且只能被你的应用程序访问(如果用户没有直接链接到 S3) ,你甚至不需要支付任何带宽费用,只需要支付50MB 的存储费用。

这个解决方案似乎只适用于某些修补过的 Git 版本。有关哪些版本可以工作的提示,请参见 指向变通方法的新答案另一个答案和随后的评论

我写了一篇关于如何有效地将 excludesfile用于不同分支的博客文章,比如一个用于 public 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

Github 现在支持大文件存储,请参阅这里的 https://git-lfs.github.com/

重要提示 : 认知接受的答案。Mind 已经不工作了(现在已经有好几年了,或者可能是普通的 git 版本) ; 请看评论。在这里可以找到一个有效的答案和解决办法:

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

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

最后,我现在使用的解决方案是分叉我的 VM,我们把开发环境放在其中,并为分支适当地设置 info/excludes,分别删除违规的、未提交的文件/文件夹。

假设我们要忽略除 production分支以外的所有其他分支的 build文件夹。因为我们要在生产中推 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文件夹,但是还没有添加它。吉蒂诺尔。那么 Git 如何知道要忽略哪些内容呢?答案是,我们将其添加到 exclude文件,并有条件地将该文件传递给 git config

5)现在我们必须有条件地忽略 production分支的 build文件夹

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

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

[core]
excludesfile = +info/exclude

B)在 ./.git/config的结尾创建一个新的部分,作为

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

解决方案2

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

1)加入你的 gitignore档案。

2)在生产部门,在做 git add时,强制添加 build文件夹: git add -f --all build/

1. 摘要

  1. 我用 特拉维斯 CI代表 部署 (一个 href = “ https://docs.Travis-ci.com/user/loyment/Heroku/”rel = “ nofollow noReferrer”> < strong > 它支持 Heroku 部署 )
  2. 我在我的 .travis.yml中加上:

    before_deploy:
    - mv misc/.gitignore .gitignore
    

    其中 miscー任何文件夹,包含另一个 .gitignore

    命令 move file; 覆盖,如果文件已经存在。

当特拉维斯 CI 部署项目,特拉维斯 CI 将不会推到 < strong > 部署提供程序 文件和文件夹,这忽略在 misc/.gitignore(不在原来的 .gitignore的资源)。


2. 限制

  1. 这个答案可能不适合作者的所有情况。但是这个答案回答了这样一个问题: “使用 git,我如何忽略一个分支中的文件,但是让它在另一个分支中提交?”
  2. 我不是 Heroku 用户,我的例子是 < strong > GitHub ,不是 Heroku。这个答案的数据在 GitHub 上对我有用,但在 Heroku 上可能不起作用。

3. 相关性

这个答案与2018年4月有关。未来,这个答案的数据可能会过时。


4. 示范

我的 真正的项目

成功部署 的示例。

4.1任务

我将项目从同一存储库的 src 分支部署到 est 分支。

我要那个文件 PaletteMira.suricate-profile:

  • 本地机器ー存在于所有分支,
  • Src 远程分支ー不存在,
  • 设立的远程分支ーー存在。

如果我正确理解了问题的作者,他也有类似的任务。

4.2. src

资源分支ーー < strong > 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

目的地分支ーー < strong > SashaDevelopment

强 > .gitignore部分:

*.sublime-snippet

*.suricate-profile不在 misc/.gitignore

PaletteMira.suricate-profile存在于此分支 远程控制和本地。

4.4繁殖步骤

我为 Travis CI → I 环境变量 $GITHUB_TOKEN启用 PaletteMira GitHub 存储库,并赋值ーー我的 < strong > GitHub 标记 →我对我的 src 分支进行任何提交。

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

最初的问题是一个小或者,但我碰到了它,因为我刚刚写了一个 中等质量的物品关于它,我想这可能会有所帮助的人。

我个人已经解决了这与 钩子通过 强壮-似乎是 最简单和最可靠的解决方案。

显然,我建议阅读这篇文章,但这里是 繁殖的步骤

  • 步骤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: 本主要内容复制粘贴到 .husky/post-checkout