Bagaimana cara menerapkan / mendorong hanya subdirektori dari repo git saya ke Heroku?


121

Saya memiliki proyek yang menggunakan Serve dan versinya dikontrol menggunakan Git. Serve membuat outputfolder dengan file statis yang ingin saya terapkan ke Heroku.

Saya tidak ingin menerapkan proyek Serve itu sendiri karena stack Heroku Cedar tampaknya tidak terlalu menyukainya, tetapi yang terpenting saya ingin memanfaatkan dukungan hebat Heroku untuk situs web statis.

Apakah ada cara untuk menerapkan subfolder ke git remote? Haruskah saya membuat repo Git di outputfolder (kedengarannya salah) dan memasukkannya ke Heroku?


1
Anda mungkin mencari submodul: book.git-scm.com/5_submodules.html
greg0ire

Jawaban:


220

Ada cara yang lebih mudah melalui git-subtree . Dengan asumsi Anda ingin mendorong folder 'keluaran' Anda sebagai root ke Heroku, Anda dapat melakukan:

git subtree push --prefix output heroku master

Tampaknya saat ini git-subtree sedang dimasukkan ke dalam git-core, tetapi saya tidak tahu apakah versi git-core itu telah dirilis.


1
Ya, tetapi subtree masih (mulai 1.8.0.2) tidak disertakan melalui penginstal git . Untungnya menginstal dari sumber cepat dan mudah, halaman ini berfungsi untuk saya di mac.
dribnet

14
Jika perlu --force, gunakan git push heroku `git subtree split --prefix output master`:master --force. Lihat stackoverflow.com/a/15623469/2066546 .
fiedl

2
Tapi bagaimana cara yang benar untuk mendorong tag tertentu. Saya pikir itu harus git subtree push --prefix output heroku +refs/tags/v1.0.0:refs/heads/master. Tapi ini tidak berhasil dan kembali dengan +refs/tags/v1.0.0:refs/heads/master does not look like a ref. Saya membutuhkan fungsi semacam ini agar dapat menggulirkan kembali ke tag tertentu nanti. Apa cara yang benar untuk melakukan itu?
denis

1
Saya mendapatkan pesan kesalahan 'Pembaruan ditolak karena ujung cabang yang didorong ada di belakang remote-nya'
Ally

2
@ and-dev @Eric Burel Saya berhasil mendorong outputfolder yang hanya ada di developcabang saya ke heroku mastercabang tanpa perlu menentukan develop:master, jadi tampaknya itu mendorong ke cabang target yang Anda tentukan dari cabang yang saat ini Anda periksa.
cprcrack

10

Saya mulai dengan apa yang dikatakan John Berryman, tetapi sebenarnya itu bisa lebih sederhana jika Anda tidak peduli sama sekali tentang sejarah heroku git.

cd bin
git init
git add .
git commit -m"deploy"
git push git@heroku.com:your-project-name.git -f
rm -fr .git

Saya kira resmi git subtreeadalah jawaban terbaik, tetapi saya mengalami masalah mendapatkan subtree untuk bekerja di Mac saya.


9

Saya memiliki masalah serupa. Dalam kasus saya, tidak ada masalah untuk membuang semua yang ada di repositori heroku dan menggantinya dengan apa pun yang ada di subdirektori saya. Jika ini kasus Anda, Anda dapat menggunakan skrip bash berikut. Taruh saja di direktori aplikasi Rails Anda.

#!/bin/bash

#change to whichever directory this lives in
cd "$( dirname "$0" )"

#create new git repository and add everything
git init
git add .
git commit -m"init"
git remote add heroku git@heroku.com:young-rain-5086.git

#pull heroku but then checkback out our current local master and mark everything as merged
git pull heroku master
git checkout --ours .
git add -u
git commit -m"merged"

#push back to heroku, open web browser, and remove git repository
git push heroku master
heroku open
rm -fr .git

#go back to wherever we started.
cd -

Saya yakin ada banyak cara untuk memperbaikinya - jadi silakan beri tahu saya caranya!


+1Terima kasih. Solusi ini berfungsi dengan baik jika Anda tidak peduli dengan log git di Heroku. Seseorang dapat mengubah skrip di atas jika ada beberapa folder yang ingin Anda abaikan, di dalam sub path aplikasi yang akan digunakan. Misalnya saya tidak ingin specfolder di heroku. Contoh
Inti

+1tetapi Anda dapat menyederhanakan dengan tidak menarik dan menggabungkan ke master heroku dan sebaliknya hanyagit push --force heroku master
MK Safi

4

Setelah sebulan yang panjang dan berat mencoba berbagai hal dan digigit setiap kali saya menyadari,

hanya karena Heroku menggunakan repositori git sebagai mekanisme penerapan, Anda tidak boleh memperlakukannya sebagai repositori git

bisa juga rsync, mereka menggunakan git, jangan sampai teralihkan karena ini

jika Anda melakukannya, Anda membuka diri terhadap semua jenis luka. Semua solusi yang disebutkan di atas gagal total di suatu tempat:

  1. itu membutuhkan sesuatu untuk dilakukan setiap waktu, atau secara berkala, atau hal-hal tak terduga terjadi (mendorong submodul, menyinkronkan subpohon, ...)
  2. jika Anda menggunakan mesin misalnya untuk memodularisasi kode Anda, Bundler akan memakan Anda hidup-hidup, tidak mungkin untuk menggambarkan jumlah frustrasi yang saya alami dengan proyek itu selama pencarian untuk menemukan solusi yang baik untuk ini
    • Anda mencoba menambahkan mesin sebagai tautan git repo + bundle deploy- gagal, Anda perlu memaketkan pembaruan setiap saat
    • Anda mencoba menambahkan mesin sebagai :path+ bundle deploy- gagal, tim pengembang menganggap :pathopsi sebagai "Anda tidak menggunakan Bundler dengan opsi permata ini" sehingga tidak akan digabungkan untuk produksi
    • juga, setiap penyegaran mesin ingin memperbarui tumpukan rel Anda -_-
  3. satu-satunya solusi yang saya temukan adalah menggunakan engine sebagai /vendorsymlink dalam pengembangan, dan sebenarnya menyalin file untuk produksi

Solusinya

Aplikasi yang dimaksud memiliki 4 proyek di git root:

  1. api - tergantung pada profilnya akan berjalan di 2 host heroku yang berbeda - unggah dan api
  2. web - situs web
  3. web-lama - situs web lama, masih dalam migrasi
  4. Common - komponen umum yang diekstraksi dalam mesin

Semua proyek memiliki vendor/commonsymlink yang melihat ke root commonmesin. Saat menyusun kode sumber untuk diterapkan ke heroku, kita perlu menghapus symlink dan rsync kode itu secara fisik berada di folder vendor dari setiap host terpisah.

  1. menerima daftar nama host sebagai argumen
  2. menjalankan git push di repo pengembangan Anda dan kemudian menjalankan git pull bersih di folder terpisah, memastikan tidak ada perubahan kotor (tidak terikat) yang didorong ke host secara otomatis
  3. menyebarkan host secara paralel - setiap heroku git repo ditarik, kode baru disinkronkan ke tempat yang tepat, berkomitmen dengan informasi push dasar di komentar git commit,
  4. pada akhirnya, kami mengirim ping dengan curl untuk memberi tahu host hobi untuk bangun dan membuntuti log untuk melihat apakah semua anggur habis.
  5. bermain bagus dengan jenkins juga: D (dorongan kode otomatis untuk menguji server setelah tes berhasil)

Bekerja sangat sangat baik di alam liar dengan masalah minimal (bukan?) 6 bulan sekarang

Berikut skripnya https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f

Perbarui 1

@AdamBuczynski, ini tidak pernah sesederhana itu.

Pertama, Anda akan selalu memiliki produksi dan lingkungan pengujian setidaknya - dan sekumpulan cluster khusus fungsi yang lebih buruk - tiba-tiba 1 folder perlu dipetakan ke proyek heroku sebagai persyaratan yang cukup mendasar dan semuanya perlu diatur sedemikian rupa sehingga skrip "tahu" sumber apa yang ingin Anda terapkan di mana,

Kedua, Anda akan ingin berbagi kode antar proyek - sekarang sync_commonbagiannya, shennanigans dengan symlink dalam pengembangan diganti dengan kode rsynced yang sebenarnya di Heroku karena Heroku memerlukan struktur folder tertentu dan bundler dan rubygems benar-benar benar-benar membuat segalanya menjadi jelek sangat buruk jika Anda ingin mengekstrak benang merah menjadi permata

Ketiga Anda akan ingin memasang CI dan itu akan mengubah sedikit bagaimana subfolder dan repo git perlu diatur, pada akhirnya dalam kasus penggunaan yang paling sederhana Anda berakhir dengan inti yang disebutkan di atas.

Dalam proyek lain saya perlu memasang Java build, ketika menjual perangkat lunak ke banyak klien Anda perlu memfilter modul yang diinstal tergantung pada persyaratan instalasi dan yang lainnya,

Saya harus benar-benar mempertimbangkan untuk menjelajahi menggabungkan hal-hal menjadi Rakefile atau sesuatu dan melakukan semuanya dengan cara itu ...


Hai @bbozo, maukah Anda memadatkan solusi Anda sedikit dan membuatnya khusus untuk kasus penggunaan penerapan satu sub folder tertentu ke satu proyek heroku tertentu dan mengambil semua hal yang tidak diperlukan / khusus untuk Heroku?
Adam Reis

Terima kasih telah memperbarui jawaban Anda. Saya pikir saya hanya akan sedikit memahami dan membagi kode sisi klien dan server saya menjadi repositori terpisah. Tidak ideal untuk situasi kita, tetapi ini akan mengalahkan dorongan subtree paksa yang harus kita lakukan sekarang, dan dari apa yang saya kumpulkan, juga akan jauh lebih sederhana daripada mencoba menggunakan symlink.
Adam Reis

Jangan takut dengan "skrip
penerapan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.