Menggunakan git, bagaimana cara saya mengabaikan file di satu cabang tetapi apakah itu dilakukan di cabang lain?

157

Saya punya proyek yang saya gunakan untuk Heroku . Pohon kode sumber mencakup banyak file mp3 (situs web ini akan digunakan untuk proyek rekaman yang sangat saya ikuti).

Saya ingin meletakkan kode sumbernya di GitHub , tetapi GitHub memiliki batas 300 MB pada akun gratis mereka. Saya tidak ingin menggunakan 50 MB dari batas saya pada banyak file mp3. Jelas, saya bisa menambahkannya ke .gitignorefile untuk menjaga mereka dari repo saya.

Namun, saya menggunakan Heroku menggunakan git push heroku. File mp3 harus ada di cabang saya mendorong ke Heroku sehingga mereka bisa digunakan.

Idealnya, saya ingin .gitignorefile mp3 di cabang master lokal saya sehingga ketika saya mendorongnya ke GitHub, mp3 tidak termasuk. Maka saya akan menjaga cabang produksi lokal yang memiliki mp3 berkomitmen daripada diabaikan. Untuk menggunakan, saya akan menggabungkan master ke dalam produksi, dan kemudian mendorong cabang produksi ke Heroku.

Saya tidak bisa melakukan ini dengan benar.

Ini adalah contoh dari apa yang saya coba lakukan ...

$ git init git-ignore-test
$ cd git-ignore-test
$ echo "*.ignored" >> .gitignore
$ git add .gitignore && git commit -m "Ignore .ignored files"
$ touch Foo.ignored

Pada titik ini, Foo.ignored diabaikan di cabang master saya, tetapi masih ada, sehingga proyek saya dapat menggunakannya.

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

Sekarang saya punya cabang dengan file-file ini dilakukan, seperti yang saya inginkan. Namun, ketika saya beralih kembali ke cabang master saya, Foo.ignored hilang.

Adakah yang punya saran untuk cara yang lebih baik untuk mengatur ini?

Sunting: hanya untuk memperjelas, saya ingin file mp3 hadir di kedua cabang sehingga ketika saya menjalankan situs secara lokal (menggunakan salah satu cabang) situs berfungsi. Saya hanya ingin file diabaikan dalam satu cabang jadi ketika saya mendorong ke GitHub mereka tidak didorong juga. Biasanya .gitignore berfungsi dengan baik untuk hal semacam ini (yaitu menyimpan salinan file lokal yang tidak dimasukkan dalam push ke remote), tetapi ketika saya beralih ke cabang dengan file-file yang diperiksa, dan kemudian kembali ke cabang dengan file diabaikan, file hilang.

Myron Marston
sumber
Mengapa file MP3 pernah harus berkomitmen untuk repositori?
Dan Loewenherz
4
Dengan heroku, komit ke repo Anda adalah satu-satunya cara untuk mendapatkan file yang disertakan dengan aplikasi Anda saat Anda menggunakan. Satu-satunya alternatif adalah menggunakan sesuatu seperti Amazon S3 untuk melayani mp3, tetapi saya lebih suka menghindari itu.
Myron Marston
Kedengarannya seperti Anda tersandung dolar untuk menyimpan uang ... The Rackspace Cloud sangat sederhana untuk mendapatkan setup pada, dan itu akan biaya sangat sedikit untuk toko <1 GB file yang ada ...
gahooa
3
Saya perhatikan Anda menandai jawaban sebagai benar tetapi dari apa yang saya baca itu mungkin tidak benar. Apakah Anda pernah benar-benar mencoba jawabannya dan apakah itu berhasil untuk Anda?
loop
2
Off Topic: Sudahkah Anda mempertimbangkan untuk menggunakan host repositori open source lainnya? BitBucket tidak memiliki batasan ukuran pada repositori Git mereka, terlepas dari apakah mereka berada di akun gratis atau tidak (mereka menyebutkan untuk menjaga ukurannya sesuai alasan, meskipun). Selama repo Anda tidak tumbuh di luar kendali, ini mungkin menjadi pilihan. CATATAN: Saya tidak terkait dengan BitBucket, hanya pelanggan yang senang.
NightOwl888

Jawaban:

84

Solusi ini tampaknya hanya berfungsi untuk versi tertentu dari git. Lihat jawaban baru yang menunjuk ke pemecahan masalah dan jawaban lain serta komentar selanjutnya untuk petunjuk versi mana yang bisa bekerja.

Saya menulis posting blog tentang cara efektif menggunakan excludesfileuntuk cabang yang berbeda, seperti satu untuk github publik dan satu untuk penyebaran heroku.

Inilah yang cepat dan kotor:

$ git branch public_viewing
$ cd .git/
$ touch info/exclude_from_public_viewing
$ echo "path/to/secret/file" > info/exclude_from_public_viewing 

kemudian dalam file .git / config tambahkan baris ini:

[core]
excludesfile = +info/exclude


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

Sekarang semua hal abaikan global ada dalam info/excludefile dan cabang spesifik ada diinfo/exclude_from_public_viewing

Semoga itu bisa membantu!

http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches

Kognisi
sumber
1
Maaf telah mengambil begitu lama .. tetapi jika Anda tidak menghapus file .gitignore itu akan menjadi default untuk yang pertama.
Cognition.Mind
4
Ini tidak berfungsi untuk saya, bahkan ketika proyek tidak menggunakan .gitignore. Apakah Anda keberatan memberikan transkrip perintah yang mengatur ini dari awal ( git init, ...), dan versi Git yang Anda gunakan?
Davor Cubranic
34
Solusi ini tidak berfungsi. Ada beberapa diskusi di blog, dan tidak ada seorang pun di sana yang bisa membuat pekerjaan ini baik.
Pengamen
2
Di vanilla Git, saya cukup yakin ini tidak berhasil dan tidak pernah berhasil. Anda yang berhasil mereproduksi ini, dapatkah Anda membagikan versi Git Anda dan info terkait lainnya di lingkungan Anda? Mungkin Anda memiliki versi tambalan dari pengelola paket Git distribusi Anda.
Palec
20

Petunjuk penting : Jawaban yang diterima oleh Cognition.Mind tidak bekerja (lagi, untuk beberapa tahun sekarang, atau mungkin untuk versi vanilla git); lihat komentar. Jawaban dan solusi yang valid dapat ditemukan di sini:

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

Solusi alternatif lain (bekerja untuk masalah khusus saya, tetapi menuntut operasi simpanan manual atau implementasi hook) akan menjadi git stash -u -a. Ini membosankan ketika perbedaannya besar.

Dan akhirnya, solusi yang saya gunakan sekarang adalah mem-forked VM saya yang kami gunakan dalam lingkungan pengembangan kami, dan mengaturnya dengan info/excludestepat untuk cabang, masing-masing menghapus file / folder yang menyinggung, yang tidak dikomit.

Murphy
sumber
14

Saya akan sangat menyarankan untuk meletakkan file-file MP3 pada S3. Memiliki mereka menjadi bagian dari push Heroku Anda (dan dengan demikian bagian dari siput Heroku Anda) akan sangat memperlambat waktu startup dyno Anda. Karena Heroku menggunakan EC2, jika file pada S3 dan hanya diakses oleh aplikasi Anda (jika pengguna tidak terhubung langsung ke S3) Anda bahkan tidak akan membayar biaya bandwidth, hanya biaya untuk menyimpan 50MB.

David Dollar
sumber
13

Katakanlah kita ingin mengabaikan buildfolder dari semua cabang lain kecuali productioncabang. Karena kami ingin mendorong buildfolder dalam produksi.

1) Jangan memasukkan builddalam .gitignore. Jika Anda melakukannya, itu akan selalu diabaikan untuk semua cabang.

2) Buat file exclude_from_public_viewingdi dalam ./.git/infofolder (Folder ini sudah ada)touch ./.git/info/exclude_from_public_viewing

3) Di dalam exclude_from_public_viewingtulis satu baris (Ketika Anda mencoba untuk mengabaikan buildsemua cabang). !build

4) Ada file yang ada .git/info/exclude. Kita perlu menambahkan baris berikut di dalamnya.

 build

Kami ingin mengabaikan buildfolder tetapi belum menambahkannya di .gitignore. Jadi bagaimana git akan tahu apa yang harus diabaikan? Jawabannya adalah kita menambahkannya ke excludefile dan secara kondisional mengirimkan file itugit config

5) Sekarang kita harus secara unignore buildmenghapus folder untuk productioncabang. untuk melakukan itu lakukan berikut

6) Ada file yang ada yang disebut ./.git/configkita perlu menambahkan berikut -

a) di excludesfile = +info/excludebawah ini[core]

[core]
     excludesfile = +info/exclude

b) Buat bagian baru di akhir ./.git/configas

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

Solusi 2

Ada satu solusi alternatif yang cerdas. Katakanlah Anda ingin menambahkan build/folder di productioncabang dan abaikan di semua cabang lainnya.

1) Tambahkan ke gitignorefile Anda .

2) Di cabang produksi, saat melakukan git add, paksa tambahkan buildfolder:git add -f --all build/

lemah
sumber
Dan ini berbeda dari solusi yang diterima bagaimana? Dengan versi git mana Anda mengujinya? Sebagai jawaban yang ditautkan menyatakan gagal karena tidak ada dukungan untuk branch.<name>.excludesfiledi git (lagi?), Hanya untuk core.excludesfile, dan tes saya sendiri sepertinya menegaskan hal ini.
Murphy
@murphy berfungsi dengan baik git version 2.7.4 (Apple Git-66)dan saya belum pernah menggunakan branch.<name>.excludesfile solusi saya.
Sapy
4
@sapy: Saya mencoba ini sesuai dengan use case OP, dan file tersebut masih hilang ketika saya beralih dari produksi ke master. Perhatikan bahwa folder "build" harus dimasukkan ke cabang "produksi". (Juga, saya perhatikan bahwa jika saya tidak melakukan folder "build" di cabang "produksi", cabang "produksi" mengabaikan keberadaan folder "build" - yaitu, [cabang "produksi"] tidak termasuk file konfigurasi config doesn dapat bekerja). Saya menggunakan versi git yang persis sama dengan milik Anda. Saya juga mencoba pendekatan [cabang "produksi"] untuk mengabaikan file hanya di cabang produksi, itu juga tidak berhasil, seperti kata Murphy.
justhalf
Solusi 2 adalah sesuatu yang saya cari. Terima kasih!
Vyacheslav Cotruta
4

Sudahkah Anda mencoba .gitignore berbeda di cabang Anda?

Anda harus dapat mengabaikan apa yang Anda inginkan berdasarkan cabang Anda selama file tidak dilacak di cabang itu.

KEND
sumber
6
Saya sudah mencobanya. Jika Anda melihat perintah yang saya posting di atas Anda akan melihat apa yang saya lakukan. Masalahnya adalah ketika saya beralih dari cabang dengan file yang diperiksa ke cabang dengan file yang diabaikan, git membuang file. Saya ingin menyimpan mp3s di cabang master saya sehingga situs berfungsi dengan baik dalam mode dev, meskipun file diabaikan.
Myron Marston
1
dia sudah mengatakan itu yang dia lakukan. mungkin hanya menghapus jawaban ini mungkin yang terbaik :-) yang menyebabkan gangguan.
mengacaukan
3

1. Ringkasan

  1. Saya menggunakan Travis CI untuk ditempatkan ( mendukung penyebaran Heroku )
  2. Saya tambahkan ke .travis.yml:

    before_deploy:
    - mv misc/.gitignore .gitignore
    

    Di mana misc- folder apa pun, berisi folder lain .gitignore.

    mvUNIX memindahkan file perintah ; Timpa, jika file sudah ada.

Ketika Travis CI menyebarkan proyek, Travis CI tidak akan mendorong untuk menyebarkan file dan folder penyedia , yang mengabaikan misc/.gitignore(bukan dalam .gitignoresumber asli).


2. Keterbatasan

  1. Jawaban ini mungkin tidak cocok untuk semua kondisi penulis. Tetapi jawaban ini menjawab pertanyaan “Menggunakan git, bagaimana saya mengabaikan file di satu cabang tetapi apakah itu dilakukan di cabang lain?”
  2. Saya bukan pengguna Heroku, contoh saya untuk GitHub , bukan untuk Heroku. Data jawaban ini berfungsi untuk saya di GitHub, tetapi mungkin tidak berfungsi pada Heroku.

3. Relevansi

Jawaban ini relevan untuk April 2018. Di masa mendatang, data dari jawaban ini mungkin sudah usang.


4. Demonstrasi

proyek saya yang sebenarnya .

Contoh penerapan yang sukses .

4.1. Tugas

Saya menyebarkan proyek saya dari cabang src ke cabang dest dari repositori yang sama.

Saya ingin, file itu PaletteMira.suricate-profile:

  • Mesin lokal - ada untuk semua cabang,
  • cabang jauh src - tidak ada,
  • cabang remote dest - ada.

Jika saya benar mengerti pertanyaan penulis, ia memiliki tugas yang sama.

4.2. src

cabang sumber - SashaYAML .

Bagian dari .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

Bagian dari .gitignore:

*.sublime-snippet
*.suricate-profile

Bagian dari misc/.gitignore

*.sublime-snippet

*.suricate-profiletidak misc/.gitignore.

PaletteMira.suricate-profile tidak ada di cabang ini dari jarak jauh, tetapi ada secara lokal.

4.3. dest

cabang tujuan - SashaDevelop

Bagian dari .gitignore:

*.sublime-snippet

*.suricate-profiletidak misc/.gitignore.

PaletteMira.suricate-profileada untuk cabang ini dari jarak jauh dan lokal.

4.4. Langkah-langkah mereproduksi

Saya mengaktifkan repositori PaletteMira GitHub untuk Travis CI → Saya mengatur variabel lingkungan $GITHUB_TOKEN dengan nilai - token GitHub saya→ Saya membuat komit ke cabang src saya.

Jika tidak ada kesalahan, saya harus mendapatkan perilaku yang diharapkan .

Саша Черных
sumber
0

Bisakah Anda berkomitmen dan mendorong dari Heroku?

mis. Tambah audio, dorong ke github dan masuk ke heroku, hapus file pada copy pekerjaan di Heroku. Hapus audio dari repo tetapi tidak dari disk, lalu dorong kembali perubahan itu ke github.

Tom
sumber
0

Github sekarang memiliki dukungan untuk penyimpanan file besar, lihat lebih lanjut di sini https://git-lfs.github.com/

John Lozano
sumber