gitを使用して、あるブランチのファイルを無視して別のブランチでコミットするにはどうすればよいですか?


156

Herokuにデプロイするプロジェクトがあります。ソースコードツリーには多数のmp3ファイルが含まれています(このWebサイトは、私が深く関わっていたレコーディングプロジェクト用です)。

そのソースコードをGitHubに載せたいのですが、GitHubの無料アカウントには300 MBの制限があります。一連のmp3ファイルに50 MBの制限を使用したくありません。明らかに、それらを.gitignoreファイルに追加して、それらを私のリポジトリから遠ざけることができます。

ただし、私はHerokuにを使用してデプロイしgit push herokuます。mp3ファイルは、Herokuにプッシュするブランチに存在して、デプロイされるようにする必要があります。

理想的に.gitignoreは、ローカルマスターブランチのmp3ファイルをGitHubにプッシュしたときにmp3が含まれないようにしたいと考えています。次に、mp3が無視されるのではなくコミットされたローカルの本番ブランチを保持します。デプロイするには、マスターを本番環境にマージしてから、本番ブランチを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ファイルを両方のブランチに存在させて、サイトをローカルで(どちらかのブランチを使用して)実行したときにサイトが機能するようにします。1つのブランチでファイルを無視したいだけなので、GitHubにプッシュすると、それらもプッシュされません。通常、.gitignoreはこの種のこと(つまり、リモートへのプッシュに含まれないファイルのローカルコピーを保持すること)に適していますが、ファイルをチェックインした状態でブランチに切り替えてから、ファイルを無視してブランチすると、ファイルは消えます。


なぜMP3ファイルがない、これまでリポジトリにコミットする必要がありますか?
Dan Loewenherz、

4
herokuでは、デプロイ時にアプリにファイルを含める唯一の方法は、リポジトリへのコミットです。唯一の選択肢は、Amazon S3のようなものを使用してMP3を提供することですが、私はそれを避けたいと思います。
Myron Marston、


3
回答に正解のマークを付けましたが、読んだ内容から正解ではない可能性があります。実際に答えを試してみて、うまくいったことはありますか?
ループ

2
トピック外:別のオープンソースリポジトリホストの使用を検討しましたか?BitBucketは、無料のアカウントであるかどうかに関係なく、Gitリポジトリにサイズ制限はありません(ただし、サイズを妥当な範囲内に保つことについて言及しています)。リポジトリが制御不能に成長していない限り、これはオプションかもしれません。注:私はBitBucketとは関係ありません。
NightOwl888 2012

回答:


83

このソリューションは、パッチを当てた特定のバージョンの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


1
時間がかかりすぎて申し訳ありません。...gitignoreファイルを削除しない場合、デフォルトで最初に削除されます。
Cognition.Mind 2011

4
これは、プロジェクトで.gitignoreを使用していない場合でも機能しません。これを最初から設定するコマンドのトランスクリプト(git init、...)、および使用したGitのバージョンを提供してもよろしいですか?
Davor Cubranic 2012年

34
このソリューションは機能しません。ブログでいくつかの議論があり、誰もこの仕事をすることができませんでした。
2013年


2
バニラGitでは、これはうまくいかなかったし、まったく動かなかったと私は確信しています。これをなんとか再現できた皆さん、Gitバージョンとその他の関連情報を環境で共有できますか?たぶん、あなたはあなたのディストリビューションのGitパッケージメンテナからパッチを当てたバージョンを持っているでしょう。
Palec、2016

20

重要なヒント:Cognition.Mindが受け入れた回答は機能しません(もう数年前から、またはおそらくgitのバニラバージョンで)。コメントをご覧ください。有効な回答と回避策はここにあります:

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

別の代替回避策(私の特定の問題には機能しますが、手動のstash操作またはフックの実装を要求します)はですgit stash -u -a。違いが大きい場合、これは面倒です。

最後に、私が今行っている解決策は、開発環境を保持するVMをfork info/excludesし、ブランチに適切にセットアップして、問題のあるコミットされていないファイル/フォルダーをそれぞれ削除することです。


14

これらのMP3ファイルをS3に配置することを検討することを強くお勧めします。それらをHerokuプッシュの一部(したがって、Herokuスラグの一部)にすると、dynoの起動時間が大幅に遅くなります。HerokuはEC2を使用しているため、ファイルがS3にあり、アプリからのみアクセスされる場合(ユーザーがS3に直接リンクされていない場合)、帯域幅の料金を支払う必要はなく、50MBを保存するための料金のみを支払います。


13

buildブランチ以外のすべてのブランチからのフォルダーを無視したいとしましょうproductionbuildフォルダーを本番にプッシュしたいので。

1)含めない build .gitignoreにでください。これを行うと、すべてのブランチで常に無視されます。

2)(このフォルダーは既に存在します)フォルダーexclude_from_public_viewing内にファイルを作成し./.git/infoますtouch ./.git/info/exclude_from_public_viewing

3)内部でexclude_from_public_viewing1行を書き込みます(buildすべてのブランチで無視しようとしているため)。 !build

4)既存のファイルがあります.git/info/exclude。それに次の行を追加する必要があります。

 build

buildフォルダーを無視したいが、.gitignoreに追加していません。では、gitは何を無視すべきかをどのようにして知るのでしょうか?答えは、excludeファイルに追加し、条件付きでそのファイルを渡すことですgit config

5)次にbuildproductionブランチのフォルダーを条件付きで無視する必要があります。それを行うには、以下を実行します

6)./.git/config以下を追加する必要があるという既存のファイルがあります-

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

[core]
     excludesfile = +info/exclude

b)./.git/configas の最後に新しいセクションを作成する

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

解決策2

スマートな代替ソリューションが1つあります。ブランチにbuild/フォルダを追加productionし、他のすべてのブランチではそれを無視したいとします。

1)gitignoreファイルに追加します。

2)運用ブランチで、を実行中にgit addbuildフォルダーを強制的に追加します。git add -f --all build/


そして、これは受け入れられているソリューションとどのように異なりますか?gitのどのバージョンでテストしましたか?リンクされた回答は、branch.<name>.excludesfile(それ以上)in git のサポートがないため失敗しcore.excludesfile、私自身のテストではこれを確認しているようです。
マーフィー、

@murphyそれはうまく動作しgit version 2.7.4 (Apple Git-66)、私はbranch.<name>.excludesfile 自分のソリューションで使用していません。
2016

4
@sapy:OPのユースケースに従ってこれを試しましたが、プロダクションからマスターに切り替えてもファイルは消えます。「build」フォルダを「production」ブランチにコミットする必要があることに注意してください。(また、「production」ブランチの「build」フォルダをコミットしない場合、「production」ブランチは「build」フォルダの存在を無視することに注意してください。つまり、[branch「production」] excludesfile configは動作しません)。私はあなたとまったく同じバージョンのgitを使用しています。マーフィーが言ったように、私はまた、[ブランチ「プロダクション」]アプローチを試して、プロダクションブランチでのみファイルを無視しました。これも機能しません。
16

解決策2は私が探していたものでした。ありがとう!
Vyacheslav Cotruta 16

4

ブランチで.gitignoreが異なるようにしてみましたか?

ファイルがそのブランチで追跡されていない限り、現在のブランチに基づいて必要なものを無視できるはずです。


6
私はそれを試しました。上に投稿したコマンドを見ると、それがまさに私が行ったことがわかります。問題は、ファイルをチェックインしたブランチからファイルを無視したブランチに切り替えると、gitがファイルを破棄することです。ファイルが無視されても、サイトが開発モードで適切に機能するように、mp3をマスターブランチに保持したいと考えています。
Myron Marston、

1
彼はすでにそれが彼のしたことだと言った。多分この答えを削除するのが最善かもしれません:-)それが原因の注意散漫です。
blamb、

3

1.まとめ

  1. 私が使用トラヴィスCIをするために配備する これはHerokuの展開をサポートしています
  2. 私に追加します.travis.yml

    before_deploy:
    - mv misc/.gitignore .gitignore

    場所misc-任意のフォルダー、別のが含まれます.gitignore

    mvUNIXコマンド move file; ファイルがすでに存在する場合は上書きします。

Travis CIがプロジェクトをデプロイするとき、Travis CIはプロバイダーファイルとフォルダーのデプロイをプッシュせmisc/.gitignoreず、無視します(元.gitignoreのソースではありません)。


2.制限

  1. この回答は、著者のすべての条件に適しているとは限りません。しかし、この回答は「gitを使用して、あるブランチのファイルを無視して別のブランチでコミットさせるにはどうすればよいですか?」という質問に答えます。
  2. 私はHerokuユーザーではなく、GitHubの例であり、Herokuではありません。この回答のデータは、GitHubでは機能しますが、Herokuでは機能しない可能性があります。

3.関連性

この回答は2018年4月に関連しています。将来、この回答のデータは廃止される可能性があります。


4.デモ

私の本当のプロジェクト

成功した展開の例

4.1。仕事

プロジェクトを同じリポジトリのsrcブランチからdestブランチにデプロイします。

欲しい、そのファイルPaletteMira.suricate-profile

  • ローカルマシン—すべてのブランチに存在し、
  • srcリモートブランチ—存在しません、
  • destリモートブランチ—存在します。

私が質問の著者を正しく理解していれば、彼も同様の仕事をしています。

4.2。src

sourcesブランチ— 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このブランチにはリモートおよびローカルに存在します。

4.4。再現する手順

Travis CIのPaletteMira GitHubリポジトリを有効にします →値で環境変数設定$GITHUB_TOKENします— GitHubトークン → →私のsrcブランチにコミットします。

エラーがなければ、期待どおりの動作が得られるはずです。


0

Herokuをコミットしてプッシュできますか?

たとえば、オーディオを追加し、それらをgithubにプッシュしてherokuに入れ、Herokuの作業コピーにあるファイルを削除します。ディスクからではなく、リポジトリからオーディオを削除してから、その変更をgithubにプッシュして戻します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.