web-dev-qa-db-ja.com

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

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

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

ただし、git Push herokuを使用してHerokuにデプロイします。 mp3ファイルは、展開するためにHerokuにプッシュするブランチに存在する必要があります。

理想的には、ローカルマスターブランチのmp3ファイルを.gitignoreして、それを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"

必要に応じて、これらのファイルをコミットしたブランチを作成しました。しかし、マスターブランチに戻ると、Foo.ignoredはなくなりました。

これを設定するためのより良い方法についての提案はありますか?

編集:明確にするために、mp3ファイルが両方のブランチに存在するようにして、サイトをローカルで(どちらかのブランチを使用して)実行したときにサイトが機能するようにします。 1つのブランチでファイルを無視するようにしたいので、GitHubにプッシュしたときにもプッシュされません。通常、.gitignoreはこの種の場合にはうまく機能します(つまり、リモートへのプッシュに含まれないファイルのローカルコピーを保持します)が、ファイルをチェックインしてブランチに切り替えてから、ファイルが無視されたブランチは、ファイルが消えます。

149
Myron Marston

このソリューションは、特定のパッチが適用されたバージョンのgitでのみ機能するようです。 回避策を指す新しい回答 および 別の回答と後続のコメント を参照してください。どのバージョンが機能するかについてのヒントがあります。

パブリックgithub用とherokuデプロイ用など、さまざまなブランチでexcludesfileを効果的に使用する方法についてのブログ投稿を書きました。

ここに迅速で汚いものがあります:

$ 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

80
Cognition.Mind

重要なヒント:Cognition.Mindが受け入れた答えは機能しません(もう数年、現在、またはバニラバージョンのgitに対して)。コメントを参照してください。有効な回答と回避策は次の場所にあります。

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

別の代替回避策(私の特定の問題に取り組んでいますが、手動のスタッシュ操作またはフックの実装が必要です)はgit stash -u -a。違いが大きい場合、これは退屈です。

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

17
Murphy

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

14
David Dollar

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の内部に1行書き込みます(すべてのブランチで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

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

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

2)実動ブランチで、git addを実行しながら、buildフォルダーを強制的に追加:git add -f --all build/

12
sapy

あなたのブランチで.gitignoreを変えてみましたか?

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

4
kEND

1.まとめ

  1. Travis CI for deployingHeroku展開をサポートしますを使用します
  2. .travis.ymlに追加します:

    before_deploy:
    - mv misc/.gitignore .gitignore
    

    ここで、misc —任意のフォルダーには、別の.gitignoreが含まれます。

    mv UNIXコマンド ファイルを移動;ファイルが既に存在する場合は上書きします。

Travis CIがプロジェクトをデプロイするとき、Travis CIは deploying provider ファイルとフォルダーにプッシュしません。これはmisc/.gitignore元の.gitignoreではなく)を無視します。


2.制限

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

3.関連性

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


4.デモンストレーション

私の 実際のプロジェクト

成功した展開の例

4.1。仕事

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

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

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

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

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-profilemisc/.gitignoreにありません。

PaletteMira.suricate-profileは、このブランチにリモートではなく、ローカルに存在します。

4.3。 dest

宛先ブランチ— SashaDevelop

.gitignore :の一部

*.sublime-snippet

*.suricate-profilemisc/.gitignoreにありません。

PaletteMira.suricate-profileは、このブランチ リモート およびローカルに存在します。

4.4。再現する手順

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

エラーがない場合は、 予想される動作 を取得する必要があります。

Githubで大容量ファイルストレージがサポートされるようになりました。詳細はこちらをご覧ください https://git-lfs.github.com/

0
John Lozano

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

例えばオーディオを追加し、それらをgithubにプッシュしてherokuに入れ、Herokuの作業コピー上のファイルを削除します。リポジトリからオーディオを削除しますが、ディスクからは削除せずに、その変更をgithubにプッシュします。

0
Tom