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

时间:2009-12-02 23:55:23

标签: git gitignore

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

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

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

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

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

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

8 个答案:

答案 0 :(得分:80)

  

此解决方案似乎仅适用于某些已修补的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

答案 1 :(得分:16)

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

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

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

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

答案 2 :(得分:14)

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

答案 3 :(得分:12)

假设我们要忽略除build分支以外的所有其他分支的production文件夹。我们想在生产中推送build文件夹。

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

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

我们要忽略build文件夹,但尚未将其添加到.gitignore中。那么git将如何知道忽略什么?答案是我们将其添加到exclude文件并有条件地将该文件传递给git config

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

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

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

[core]
     excludesfile = +info/exclude

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

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

解决方案2

有一种智能备用解决方案。假设您要在build/分支中添加production文件夹,并在所有其他分支中忽略它。

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

2)在生产分支中,在执行git add时,强制添加build文件夹:git add -f --all build/

答案 4 :(得分:4)

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

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

答案 5 :(得分:2)

1。摘要

  1. 我使用Travis CI代表deploying it supports Heroku deployment
  2. 我添加到.travis.yml

    before_deploy:
    - mv misc/.gitignore .gitignore
    

    misc - 任何文件夹,包含另一个.gitignore

    mv UNIX command移动文件;如果文件已经存在,则覆盖。

  3. 当Travis CI部署项目时,Travis CI不会推送到misc/.gitignore中忽略的deploying provider文件和文件夹(不在原始.gitignore来源中)。

    2。限制

    1. 此答案可能不适合作者的所有条件。但是这个答案回答了这个问题:“使用git,如何忽略一个分支中的文件但是在另一个分支中提交它?”
    2. 我不是Heroku用户,我的GitHub示例,不是Heroku。这个答案的数据在GitHub中适用于我,但可能不适用于Heroku。
    3. 3。相关性

      这个答案与2018年4月有关。将来,这个答案的数据可能已经过时了。

      4。示范

      我的real project

      Example of successful deployment

      4.1。任务

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

      我想要的是,该文件PaletteMira.suricate-profile

      • 本地机器 - 适用于所有分支机构,
      • src远程分支 - 不存在,
      • dest远程分支 - 存在。

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

      4.2。 SRC

      来源分支 - 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。 DEST

      目的地分支 - SashaDevelop

      .gitignore的一部分:

      *.sublime-snippet
      

      *.suricate-profile不在misc/.gitignore

      PaletteMira.suricate-profile存在于此分支remotely和本地。

      4.4。重现的步骤

      I enable PaletteMira GitHub repository for Travis CI→我set environment variable $GITHUB_TOKEN有价值 - 我的GitHub token→我对我的src分支进行任何提交。

      如果没有错误,我必须expected behavior

答案 6 :(得分:0)

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

e.g。添加音频,将它们推送到github并进入heroku,删除Heroku上工作副本上的文件。从存储库中删除音频但不从磁盘中删除音频,然后将该更改推回到github。

答案 7 :(得分:0)

Github现在支持大文件存储,请点击此处https://git-lfs.github.com/