Git'i kullanarak, bir daldaki bir dosyayı nasıl yok sayabilirim, ancak başka bir dalda nasıl işleyebilirim?


157

Heroku'ya konuşlandırdığım bir projem var . Kaynak kodu ağacı bir grup mp3 dosyası içerir (web sitesi yoğun bir şekilde dahil olduğum bir kayıt projesi için olacaktır).

Bunun için kaynak kodunu GitHub'a koymak istiyorum , ancak GitHub'ın ücretsiz hesaplarında 300 MB sınırı var. Bir sürü mp3 dosyasında limitimin 50 MB'ını kullanmak istemiyorum. Açıkçası, .gitignoreonları depomdan uzak tutmak için dosyaya ekleyebilirim .

Ancak kullanarak Heroku'ya konuşlandırıyorum git push heroku. Mp3 dosyaları, dağıtılmaları için Heroku'ya gönderdiğim dalda bulunmalıdır.

İdeal olarak, .gitignoreyerel ana şubemdeki mp3 dosyalarını istiyorum, böylece GitHub'a ittiğimde mp3'ler dahil edilmez. Sonra mp3leri göz ardı etmek yerine işleyen yerel bir prodüksiyon şubesi tutacağım. Konuşlandırmak için ustayı üretimle birleştirir ve daha sonra üretim dalını Heroku'ya gönderirim.

Bunun doğru çalışmasını sağlayamıyorum.

İşte yapmaya çalıştığım şeyin bir örneği ...

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

Bu noktada, ana dalımda Foo.ignored yok sayılıyor, ancak hala mevcut, bu yüzden projem kullanabilir.

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

Şimdi istediğim gibi bu dosyaları işleyen bir şubem var. Ancak, ana şubeme geri döndüğümde, Foo.ignored gitti.

Bunu ayarlamanın daha iyi bir yolu için herhangi bir öneriniz var mı?

Düzenleme: sadece açıklığa kavuşturmak için, mp3 dosyaları her iki dalda mevcut olmasını istiyorum, böylece siteyi yerel olarak çalıştırdığımda (her iki dalı kullanarak) site çalışır. GitHub'a bastığımda dosyaların da itilmemesi için bir şubede yok sayılmasını istiyorum. Genellikle .gitignore bu tür bir şey için iyi çalışır (yani, bir uzaktan kumandaya dahil edilmeyen bir dosyanın yerel bir kopyasını tutmak), ancak dosyaları teslim edilmiş olarak şubeye geçip geri döndüğümde şubesi ile dosyaları yok sayılır, dosyalar kaybolur.


Neden MP3 dosyaları yok hiç depo taahhüt gerekir?
Dan Loewenherz

4
Heroku ile, deponuza bağlı kalmanız, dağıtım yaparken uygulamanızla birlikte dosya almanın tek yoludur. Tek alternatif, mp3'lere hizmet etmek için Amazon S3 gibi bir şey kullanmaktır, ancak bundan kaçınmayı tercih ederim.
Myron Marston


3
Bir cevabı doğru olarak işaretlediğinizi fark ettim ama okuduğumdan doğru olmayabilir. Aslında cevabı hiç denediniz mi ve sizin için işe yaradı mı?
döngü

2
Konu Dışı: Başka bir açık kaynak veri havuzu ana bilgisayarı kullanmayı düşündünüz mü? BitBucket'in , ücretsiz bir hesapta olup olmadıklarına bakılmaksızın Git depolarında boyut sınırı yoktur (yine de boyutu mantıklı tutmaları gerekir). Reponuz kontrolden çıkmadığı sürece bu bir seçenek olabilir. NOT: Ben sadece mutlu bir müşteri olan BitBucket ile ilişkili değilim.
NightOwl888

Yanıtlar:


84

Bu çözüm git'in yalnızca belirli yamalı sürümlerinde işe yarar. Bkz geçici çözümler için yeni bir cevap işaret ve başka bir yanıt ve daha sonraki yorumların versiyonları çalışabilir bir ipucu için.

excludesfileBiri genel github ve diğeri heroku dağıtımı için farklı dallar için nasıl etkili bir şekilde kullanılacağına dair bir blog yazısı yazdım .

İşte hızlı ve kirli:

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

daha sonra .git / config dosyasına şu satırları ekleyin:

[core]
excludesfile = +info/exclude


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

Şimdi tüm global yok sayma info/excludedosyaları dosyada ve belirli şubeinfo/exclude_from_public_viewing

Umarım yardımcı olur!

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


1
Bu kadar uzun sürdüğüm için özür dilerim. Ancak .gitignore dosyalarını silmezseniz, bu varsayılan olarak ilk olanlar olacaktır.
Biliş.Mind

4
Proje .gitignore kullanmasa bile bu benim için işe yaramıyor. Bunu sıfırdan ( git init, ...) ve kullandığınız Git sürümünden ayarlayan komutların bir transkriptini sağlamayı düşünüyor musunuz ?
Davor Cubranic

34
Bu çözüm işe yaramıyor. Blogda bir tartışma vardı ve kimse de bu işi yapamadı.
spuder


2
Vanilya Git'te bunun işe yaramadığından ve asla çalışmadığından eminim. Bunu yeniden üretmeyi başaranlarınız Git sürümünüzü ve çevrenizdeki diğer ilgili bilgileri paylaşabilir misiniz? Belki dağıtımınızın Git paketi koruyucularından yamalı bir sürümünüz vardır.
Palec

20

Önemli ipucu : Cognition.Mind tarafından kabul edilen cevap işe yaramıyor (artık birkaç yıldır ya da git vanilya versiyonlarında); yorumlara bakın. Geçerli bir yanıt ve geçici çözüm burada bulunabilir:

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

Başka bir geçici çözüm (benim özel sorunum için çalışıyor, ancak manuel saklamak işlemleri veya bir kanca uygulaması talep etmek) olurdu git stash -u -a. Farklılıklar büyük olduğunda bu sıkıcıdır.

Ve son olarak, şu an birlikte çalıştığım çözüm, geliştirme ortamımızı tuttuğumuz ve info/excludessırasıyla şube için uygun şekilde ayarladığımız VM'mi çatalladı, sırasıyla rahatsız edici, taahhüt edilmemiş dosyaları / klasörleri sildi.


14

Bu MP3 dosyalarını S3'e koymayı düşünmenizi şiddetle tavsiye ederim. Onları Heroku push'unuzun bir parçası (ve böylece Heroku slug'unuzun bir parçası) olması, dyno başlangıç ​​zamanınızı büyük ölçüde yavaşlatacaktır. Heroku EC2 kullandığından, dosyalar S3 üzerindeyse ve yalnızca uygulamanız tarafından erişildiyse (kullanıcılar doğrudan S3'e bağlı değilse) herhangi bir bant genişliği ücreti ödemezsiniz, yalnızca 50 MB depolama ücreti ödersiniz.


13

Diyelim ki buildşube hariç diğer tüm şubelerden gelen klasörleri yoksaymak istiyoruz production. buildÜretimde klasörü itmek istediğimiz için .

1) build.gitignore içine dahil etmeyin. Bunu yaparsanız, tüm şubeler için her zaman göz ardı edilir.

2) Bir dosya oluşturun exclude_from_public_viewingiçini ./.git/info(Bu klasör zaten) klasörü vartouch ./.git/info/exclude_from_public_viewing

3) İçeride exclude_from_public_viewingbir satır yazın ( buildTüm dallar için görmezden gelmeye çalıştığınız gibi ). !build

4) Mevcut bir dosya var .git/info/exclude. İçine aşağıdaki satırı eklememiz gerekiyor.

 build

buildKlasörü yoksaymak istiyoruz ancak .gitignore klasörüne eklemedik. Peki git neyi görmezden gelmeyi nasıl bilecek? Yanıt, excludedosyayı dosyaya ekleyip koşullu olarak bu dosyayagit config

5) Şimdi şube için şartlı olarak unignore buildklasör gerekir production. bunu yapmak için aşağıdakileri yapın

6) ./.git/configAşağıdakileri eklememiz gereken mevcut bir dosya var -

a) excludesfile = +info/excludeaşağıda[core]

[core]
     excludesfile = +info/exclude

b) ./.git/configas sonunda yeni bir bölüm oluşturun

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

Çözüm 2

Akıllı bir alternatif çözüm var. Diyelim ki dalda build/klasör eklemek productionve diğer tüm dallarda yoksaymak istediğinizi varsayalım.

1) gitignoreDosyanıza ekleyin .

2) Üretim dalında, klasör git addeklemeye zorlayın build:git add -f --all build/


Ve bu kabul edilen çözümden nasıl farklıdır? Git'in hangi sürümüyle test ettiniz? Bağlantılı cevabın başarısız olduğu belirtildiği için branch.<name>.excludesfilegit'te artık destek olmadığı için (artık?), Sadece için core.excludesfileve kendi testlerim bunu doğruladı.
Murphy

@murphy iyi çalışıyor git version 2.7.4 (Apple Git-66)ve benim çözümümde kullanmadım branch.<name>.excludesfile .
sapy

4
@sapy: Bunu OP'nin kullanım durumuna göre denedim ve üretimden ustaya geçiş yaptığımda dosya hala kayboluyor. "Derleme" klasörünün "üretim" bölümüne ayrılması gerektiğini unutmayın. (Ayrıca, "üretim" dalında "derleme" klasörünü işlemezsem, "üretim" dalının "derleme" klasörünün varlığını yok saydığını, yani [dal "üretimi"] hariç tutmayın. çalışmıyor). Git'in seninkiyle tam olarak aynı sürümünü kullanıyorum. Murphy'nin söylediği gibi, aynı zamanda [şube “üretim”] yaklaşımını sadece üretim kolunda görmezden gelmeyi denedim .
justhalf

Çözüm 2 aradığım bir şeydi. Teşekkürler!
Vyacheslav Cotruta

4

Şubenizde .gitignore farklı olmasını denediniz mi?

Dosyalar bu dalda izlenmediği sürece, bulunduğunuz şubeye göre ne istediğinizi göz ardı edebilmelisiniz.


6
Bunu denedim. Yukarıda gönderdiğim komutlara bakarsanız, yaptığımın aynısını göreceksiniz. Sorun ben dosyaları göz ardı ile şubeye teslim dosyaları ile şube geçiş yaptığımda git dosyaları atar olmasıdır. Ben dosyaları göz ardı bile site dev modunda düzgün çalışır böylece mp3 benim ana dalı tutmak istiyorum.
Myron Marston

1
zaten yaptığını söyledi. belki sadece bu cevabı silmek en iyi :-) onun dikkat dağıtıcı neden olabilir.
16:35

3

1. Özet

  1. Kullandığım Travis CI için dağıtma ( o Heroku dağıtımını destekler )
  2. Benim eklemek .travis.yml:

    before_deploy:
    - mv misc/.gitignore .gitignore

    Nerede misc- herhangi bir klasör, başka bir klasör içerir .gitignore.

    mvUNIX komutu taşıma dosyası; dosya zaten varsa üzerine yaz.

Travis CI projeyi dağıttığında, Travis CI yok sayılan (kaynakların orijinalinde değil) sağlayıcı dosyalarını ve klasörlerini dağıtmaya zorlamaz .misc/.gitignore.gitignore


2. Sınırlamalar

  1. Bu cevap yazarın tüm koşulları için uygun olmayabilir. Ancak bu cevap “git kullanarak, bir şubedeki bir dosyayı nasıl yok sayabilirim, ancak başka bir şubeye nasıl teslim edebilirim?” Sorusunu yanıtlar.
  2. Ben Heroku kullanıcı, benim örnekler değilim GitHub'dan değil Heroku için. Bu yanıtın verileri GitHub'da benim için çalışıyor, ancak Heroku'da çalışmayabilir.

3. Alaka Düzeyi

Bu cevap Nisan 2018 için geçerlidir. Gelecekte, bu cevabın verileri eski olabilir.


4. Gösteri

benim gerçek projem .

Başarılı dağıtım örneği .

4.1. Görev

Projemi src şubesinden aynı havuzun dest şubesine konuşlandırıyorum.

İstiyorum, o dosya PaletteMira.suricate-profile:

  • Yerel makine - tüm şubeler için var,
  • src uzak dalı - mevcut değil,
  • dest uzak dal - var.

Sorunun yazarını doğru anladıysam, benzer bir görevi var.

4.2. src

kaynakları şubesi - SashaYAML .

Parçası .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

Parçası .gitignore:

*.sublime-snippet
*.suricate-profile

Parçası misc/.gitignore

*.sublime-snippet

*.suricate-profiledeğil misc/.gitignore.

PaletteMira.suricate-profile bu dalda uzaktan mevcut değil, yerel olarak mevcut.

4.3. dest

hedef şube - SashaDevelop

Parçası .gitignore:

*.sublime-snippet

*.suricate-profiledeğil misc/.gitignore.

PaletteMira.suricate-profilebu şube için uzaktan ve yerel olarak mevcuttur.

4.4. Yeniden oluşturma adımları

Travis CI için PaletteMira GitHub depo etkinleştirmek → I seti ortam değişkeni $GITHUB_TOKEN değeri ile - benim GitHub belirteç → herhangi benim src dalı taahhüt olun.

Hata yoksa, beklenen davranışı almalıyım .


0

Taahhüt edebilir ve Heroku'dan zorlayabilir misin?

Örneğin sesi ekleyin, github'a ve heroku'ya aktarın, Heroku'daki çalışma kopyası üzerindeki dosyaları kaldırın. Sesi repodan çıkarın, ancak diskten çıkarın, ardından bu değişikliği github'a geri itin.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.