Mam projekt, który wdrażam w Heroku . Drzewo kodu źródłowego zawiera kilka plików mp3 (strona będzie dotyczyła projektu nagraniowego, w którym byłem mocno zaangażowany).
Chciałbym umieścić kod źródłowy na GitHub , ale GitHub ma limit 300 MB na swoich bezpłatnych kontach. Nie chcę wykorzystywać 50 MB z mojego limitu na kilka plików mp3. Oczywiście mogłem dodać je do .gitignore
pliku, aby nie trafiały do mojego repozytorium.
Jednak wdrażam do Heroku przy użyciu git push heroku
. Pliki mp3 muszą znajdować się w gałęzi, którą wysyłam do Heroku, aby zostały wdrożone.
Najlepiej byłoby .gitignore
, gdyby pliki mp3 znajdowały się w mojej lokalnej gałęzi głównej, aby po przesłaniu ich do GitHub pliki mp3 nie były uwzględniane. Następnie zachowałbym lokalny oddział produkcyjny, w którym pliki MP3 są zobowiązane, a nie ignorowane. Aby wdrożyć, połączyłem mistrza z produkcją, a następnie przekazałem gałąź produkcyjną do Heroku.
Nie mogę sprawić, żeby to działało dobrze.
Oto przykład tego, co próbuję zrobić ...
$ git init git-ignore-test
$ cd git-ignore-test
$ echo "*.ignored" >> .gitignore
$ git add .gitignore && git commit -m "Ignore .ignored files"
$ touch Foo.ignored
W tym momencie Foo.ignored jest ignorowany w mojej gałęzi master, ale nadal jest obecny, więc mój projekt może go używać.
$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"
Teraz mam gałąź z zatwierdzonymi plikami, tak jak chcę. Jednak kiedy przełączam się z powrotem do mojej gałęzi głównej, Foo.ignored zniknął.
Czy ktoś ma jakieś sugestie dotyczące lepszego sposobu konfiguracji?
Edycja: tylko dla wyjaśnienia, chcę, aby pliki mp3 były obecne w obu gałęziach, aby po uruchomieniu witryny lokalnie (przy użyciu dowolnej gałęzi) strona działała. Chcę tylko, aby pliki były ignorowane w jednej gałęzi, więc kiedy pcham do GitHub, również nie są wypychane. Zwykle .gitignore działa dobrze na tego typu rzeczy (tj. Przechowywanie lokalnej kopii pliku, który nie jest dołączany do zdalnego przekazywania), ale kiedy przełączam się do gałęzi z wpisanymi plikami, a następnie z powrotem do rozgałęzienia z ignorowanymi plikami pliki znikają.
Odpowiedzi:
Napisałem post na blogu o tym, jak efektywnie korzystać z
excludesfile
różnych gałęzi, takich jak jeden do publicznego github i jeden do wdrażania heroku.Oto szybkie i brudne:
następnie w pliku .git / config dodaj te linie:
Teraz wszystkie globalne rzeczy związane z ignorowaniem znajdują się w
info/exclude
pliku, a specyficzna gałąź znajduje się winfo/exclude_from_public_viewing
Mam nadzieję, że to pomoże!
http://cogniton-mind.tumblr.com/post/1423976659/howto-gitignore-for-different-branches
źródło
git init
, ...) i używanej wersji Git?Ważna wskazówka : zaakceptowana odpowiedź Cognition.Mind nie działa (już od kilku lat, a może dla waniliowych wersji gita); zobacz komentarze. Prawidłową odpowiedź i obejście można znaleźć tutaj:
https://stackoverflow.com/a/29583813/2157640
Innym alternatywnym obejściem (działającym dla mojego konkretnego problemu, ale wymagającym ręcznych operacji przechowywania lub implementacji haka) byłoby
git stash -u -a
. Jest to uciążliwe, gdy różnice są duże.I wreszcie rozwiązanie, z którego teraz korzystam, polega na rozwidleniu mojej maszyny wirtualnej, w której trzymamy nasze środowisko programistyczne, i skonfigurowaniu jej
info/excludes
odpowiednio dla gałęzi, odpowiednio usuwając naruszające, niezatwierdzone pliki / foldery.źródło
Zdecydowanie radziłbym rozważyć umieszczenie tych plików MP3 na S3. Posiadanie ich jako części pchnięcia Heroku (a tym samym części ślimaka Heroku) znacznie spowolni czas uruchamiania hamowni. Ponieważ Heroku używa EC2, jeśli pliki znajdują się na S3 i są dostępne tylko przez twoją aplikację (jeśli użytkownicy nie są bezpośrednio połączeni z S3), nie zapłacisz nawet żadnych opłat za przepustowość, tylko opłatę za przechowywanie 50 MB.
źródło
Powiedzmy, że chcemy zignorować
build
folder ze wszystkich innych gałęzi opróczproduction
gałęzi. Ponieważ chcemy wypchnąćbuild
folder w produkcji.1) Nie umieszczaj
build
w .gitignore. Jeśli to zrobisz, będzie to zawsze ignorowane dla wszystkich gałęzi.2) Utwórz plik
exclude_from_public_viewing
w./.git/info
folderze (ten folder już istnieje)touch ./.git/info/exclude_from_public_viewing
3) Wewnątrz
exclude_from_public_viewing
napisz jedną linię (tak jak próbujesz zignorowaćbuild
dla wszystkich gałęzi).!build
4) Istnieje istniejący plik
.git/info/exclude
. Musimy dodać w nim następującą linię.Chcemy zignorować
build
folder, ale nie dodaliśmy go w .gitignore. Więc skąd git będzie wiedział, co ignorować? Odpowiedź brzmi: dodajemy go doexclude
pliku i warunkowo przekazujemy dogit config
5) Teraz musimy warunkowo anulować ignorowanie
build
folderu dlaproduction
gałęzi. aby to zrobić, wykonaj następujące czynności6) Istnieje istniejący plik o nazwie
./.git/config
musimy dodać następujące -a)
excludesfile = +info/exclude
poniżej[core]
b) Utwórz nową sekcję na końcu
./.git/config
asJest jedno inteligentne alternatywne rozwiązanie. Powiedzmy, że chcesz dodać
build/
folder doproduction
gałęzi i zignorować go we wszystkich innych gałęziach.1) Dodaj go do swojego
gitignore
pliku.2) W gałęzi produkcyjnej, podczas wykonywania
git add
, wymuś dodaniebuild
folderu:git add -f --all build/
źródło
branch.<name>.excludesfile
in git (już?), Tylko dlacore.excludesfile
, a moje własne testy zdawały się to potwierdzać.git version 2.7.4 (Apple Git-66)
i nie używałem gobranch.<name>.excludesfile
w moim rozwiązaniu.Czy próbowałeś zmienić domenę .gitignore w swojej branży?
Powinieneś być w stanie zignorować to, co chcesz na podstawie gałęzi, w której się znajdujesz, o ile pliki nie są śledzone w tej gałęzi.
źródło
1. Podsumowanie
Dodaję do mojego
.travis.yml
:Gdzie
misc
- dowolny folder, zawiera inny.gitignore
.mv
Plik przenoszenia poleceń systemu UNIX ; nadpisać, jeśli plik już istnieje.Podczas wdrażania projektu Travis CI Travis CI nie będzie naciskać na wdrażanie plików i folderów dostawcy , które ignorują w
misc/.gitignore
(nie w oryginalnych.gitignore
źródłach).2. Ograniczenia
3. Trafność
Ta odpowiedź dotyczy kwietnia 2018 r. W przyszłości dane tej odpowiedzi mogą być nieaktualne.
4. Demonstracja
mój prawdziwy projekt .
Przykład pomyślnego wdrożenia .
4.1. Zadanie
Wdrażam projekt z gałęzi src do gałęzi dest tego samego repozytorium.
Chcę, aby ten plik
PaletteMira.suricate-profile
:Jeśli dobrze zrozumiałem autora pytania, ma on podobne zadanie.
4.2. src
gałąź źródeł - SashaYAML .
Część
.travis.yml
:Część
.gitignore
:Część
misc/.gitignore
*.suricate-profile
nie wmisc/.gitignore
.PaletteMira.suricate-profile
nie istnieje w tej gałęzi zdalnie, ale istnieje lokalnie.4.3. dest
oddział docelowy - SashaDevelop
Część
.gitignore
:*.suricate-profile
nie wmisc/.gitignore
.PaletteMira.suricate-profile
istnieje dla tej gałęzi zdalnie i lokalnie.4.4. kroki ku reprodukcji
Włączam repozytorium PaletteMira GitHub dla Travis CI → Ustawiam zmienną środowiskową
$GITHUB_TOKEN
z wartością - mój token GitHub → Wykonuję dowolne zatwierdzenie do mojej gałęzi src.Jeśli nie ma błędów, muszę uzyskać oczekiwane zachowanie .
źródło
Czy możesz zatwierdzać i naciskać z Heroku?
np. Dodaj audio, wypchnij je na github i do heroku, usuń pliki z kopii roboczej na Heroku. Usuń dźwięk z repozytorium, ale nie z dysku, a następnie prześlij tę zmianę z powrotem na github.
źródło
Github obsługuje teraz przechowywanie dużych plików, zobacz więcej tutaj https://git-lfs.github.com/
źródło