Як користуватися git, як я ігнорую файл в одній гілці, але чи зроблено його в іншій гілці?


157

У мене є проект, який я розгортаю в Heroku . Дерево вихідного коду включає купу файлів mp3 (веб-сайт буде для запису проекту, в якому я активно брав участь).

Я хотів би поставити вихідний код для цього на GitHub , але GitHub має обмеження в 300 Мб на своїх безкоштовних акаунтах. Я не хочу використовувати 50 Мб свого ліміту на купі mp3-файлів. Очевидно, я міг би додати їх до .gitignoreфайлу, щоб не мати їх репо.

Однак я розгортаю в Heroku за допомогою git push heroku. Mp3-файли повинні бути присутніми у гілці, яку я натискаю на Heroku, щоб вони розгорнулися.

В ідеалі, я хотів би, щоб .gitignoremp3-файли в моїй місцевій головній гілці, щоб, коли я натискаю це на 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 ігнорується в моїй головній галузі, але він все ще присутній, тому мій проект може використовувати його.

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

Тепер у мене є відділення з цими файлами, зроблені, як я хочу. Однак, коли я повертаюсь до свого головного відділення, Foo.ignored вже немає.

Хтось отримав якісь пропозиції щодо кращого способу встановити це?

Редагувати: просто для уточнення, я хочу, щоб mp3-файли були присутніми в обох гілках, щоб, коли я запускаю сайт локально (використовуючи будь-яку гілку), сайт працює. Я просто хочу, щоб файли ігнорувались в одній гілці, тому коли я натискаю на GitHub, вони також не висуваються. Зазвичай .gitignore добре працює для подібних речей (тобто зберігання локальної копії файлу, який не потрапляє під час натискання на пульт), але коли я переключаюсь на гілку із зареєстрованими файлами, а потім назад до гілка з ігнорованими файлами, файли зникають.


Чому MP3-файли коли-небудь потрібно заносити до сховища?
Dan Loewenherz

4
За допомогою heroku, приєднання до репо-репортажу - це єдиний спосіб включити файли у додаток під час розгортання. Єдина альтернатива - використовувати щось подібне Amazon S3 для обслуговування mp3-файлів, але я вважаю за краще цього уникати.
Майрон Марстон

Це здається, що ви натрапляєте на долари, щоб заощадити копійки ... Хмара Rackspace дуже проста для налаштування, і зберігати там <1 ГБ файлів буде дуже мало ...
gahooa

3
Я помічаю, що ви позначили відповідь правильною, але, з того, що я прочитав, вона може бути невірною. Ви коли-небудь насправді пробували відповідь і чи спрацювала вона для вас?
петля

2
Викл. Тема: Чи обмірковували ви використовувати інший хост сховища з відкритим кодом? BitBucket не має обмежень щодо розміру у своїх сховищах Git, незалежно від того, перебувають вони у вільному обліковому записі чи ні (вони все ж згадують про те, щоб зберегти розмір в межах причини). Поки ваше репо не виходить з-під контролю, це може бути варіантом. ПРИМІТКА: Я не асоціюється з BitBucket, просто щасливим клієнтом.
NightOwl888

Відповіді:


84

Здається, це рішення працює лише для певних, виправлених версій git. Перегляньте нову відповідь, яка вказує на обхідні шляхи, та іншу відповідь та наступні коментарі щодо підказки, які версії можуть працювати.

Я написав допис у блозі про те, як ефективно використовувати excludesfileдля різних галузей, як-то для публічного github та один для розгортання heroku.

Ось швидкий і брудний:

$ 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


1
Вибачте за те, що зайняли так довго .., але якщо ви не видалите файли .gitignore, він буде за замовчуванням першим.
пізнання. Розум

4
Це не працює для мене, навіть коли проект не використовує .gitignore. Ви не заперечуєте надати стенограму команд, яка налаштовує це з нуля ( git init, ...), і версію Git, яку ви використовували?
Давор Кубраніч

34
Це рішення не працює. У блозі була певна дискусія, і ніхто там не зміг зробити так само.
спудер


2
У ванільному Гіті я майже впевнений, що це не працює і ніколи не робив. Ти з вас, кому вдалося відтворити це, чи можете ви поділитися своєю версією Git та іншою відповідною інформацією про ваше оточення? Можливо, у вас є виправлена ​​версія з диспетчерів пакетів Git вашого дистрибутива.
Палець

20

Важлива підказка : прийнята відповідь Cognition.Mind не працює (більше, вже кілька років, або, можливо, для ванільних версій git); дивіться коментарі. Дійсну відповідь та вирішення можна знайти тут:

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

Ще одне альтернативне вирішення (працюючи на мою конкретну проблему, але вимагаючи ручних операцій з приховуванням або впровадження гака) git stash -u -a. Це нудно, коли відмінності великі.

І, нарешті, рішення, з яким я зараз збираюся, - запросив мій VM, що ми тримаємо наше середовище розробки, і налаштував info/excludesналежним чином для гілки, відповідно видаливши неприпустимі файли / папки, що не відповідають.


14

Я б настійно радив розглянути можливість розміщення цих MP3-файлів на S3. Якщо вони стануть частиною вашого натиску Heroku (і, таким чином, частиною вашої кулі Heroku), це значно сповільнить ваш час запуску дина. Оскільки Heroku використовує EC2, якщо до файлів на S3 і доступ до них лише ваш додаток (якщо користувачі не пов’язані безпосередньо з S3), ви навіть не будете платити жодну плату за пропускну здатність, лише плату за зберігання 50 Мб.


13

Скажімо, ми хочемо ігнорувати buildпапку з усіх інших гілок, крім productionгілки. Як ми хочемо висунути buildпапку у виробництві.

1) Не включайте build.gitignore. Якщо ви це зробите, це завжди буде проігноровано для всіх гілок.

2) Створіть файл exclude_from_public_viewingвсередині ./.git/info(ця папка вже існує)touch ./.git/info/exclude_from_public_viewing

3) Всередині exclude_from_public_viewingнапишіть один рядок (Як ви намагаєтесь проігнорувати buildвсі гілки). !build

4) Є вже наявний файл .git/info/exclude. Нам потрібно додати наступний рядок.

 build

Ми хочемо ігнорувати buildпапку, але не додали її в .gitignore. То як git знатиме, що ігнорувати? Відповідь - ми додаємо його у excludeфайл і умовно передаємо цей файлgit config

5) Тепер ми маємо умовно знехтувати buildпапку для productionгілки. для цього виконайте наступне

6) Існує файл, який називається, ./.git/configнам потрібно додати наступне -

а) excludesfile = +info/excludeнижче[core]

[core]
     excludesfile = +info/exclude

б) Створити новий розділ в кінці , ./.git/configяк

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

Рішення 2

Є одне розумне альтернативне рішення. Скажімо, ви хочете додати build/папку у productionвідділенні та проігнорувати її у всіх інших гілках.

1) Додайте його до свого gitignoreфайлу.

2) У виробничій галузі, виконуючи git addпримушування, додайте buildпапку:git add -f --all build/


І чим це відрізняється від прийнятого рішення? З якою версією git ви її протестували? Як пов'язана відповідь стверджує, що це не вдається, тому що немає жодної підтримки branch.<name>.excludesfileв git (більше?), Тільки для core.excludesfile, і мої власні тести, здавалося, підтверджують це.
Мерфі

@murphy це добре працює, git version 2.7.4 (Apple Git-66)і я не використовував branch.<name>.excludesfile у своєму рішенні.
сап

4
@sapy: Я спробував це відповідно до випадку використання ОП, і файл все ще зникає, коли я переходжу з виробництва на головний. Зауважте, що папка "build" повинна бути введена у відділення "production". (Також зазначу, що якщо я не здійснюю папку "build" у гілці "production", гілка "production" ігнорує наявність папки "build" - тобто [гілка "production"] виключає файл config doesn не працюю). Я використовую абсолютно таку ж версію git, як і ваша. Я також спробував [галузь "виробництво"] підходу ігнорувати файл лише у виробничій галузі, він також не працює, як сказав Мерфі.
justhalf

Рішення 2 було те, що я шукав. Дякую!
В’ячеслав Котрута

4

Чи намагалися ви мати .gitignore бути різними у своїй галузі?

Ви повинні мати можливість ігнорувати те, що ви хочете, виходячи з гілки, в якій ви перебуваєте, доки файли не відслідковуються на цій гілці.


6
Я спробував це. Якщо ви подивитеся на команди, які я розмістив вище, ви побачите, що саме це я і зробив. Проблема полягає в тому, що коли я перемикаюсь з гілки з файлами, зареєстрованими у гілку, з відхиленими файлами, git відкидає файли. Я хочу зберегти mp3s у своїй головній гілці, щоб сайт працював належним чином у режимі розробки, навіть якщо файли ігноруються.
Майрон Марстон

1
він уже сказав, що він зробив. можливо, найкраще видалити цю відповідь :-) її відволікання.
блам

3

1. Підсумок

  1. Я використовую Travis CI для розгортання ( він підтримує розгортання Heroku )
  2. Я додаю до свого .travis.yml:

    before_deploy:
    - mv misc/.gitignore .gitignore

    Де misc- будь-яка папка, містить іншу .gitignore.

    mvФайл переміщення команди команд UNIX ; перезаписати, якщо файл вже існує.

Коли проект Travis CI розгортається, Travis CI не буде натискати на розгортання файлів і папок постачальника , які ігноруються misc/.gitignore(не в оригіналі .gitignoreджерел).


2. Обмеження

  1. Ця відповідь може підходити не для всіх умов автора. Але ця відповідь відповідає на питання "Використовуючи git, як я ігнорую файл в одній гілці, але чи це зроблено в іншій гілці?"
  2. Я не користувач Heroku, мої приклади для GitHub , а не для Heroku. Дані цієї відповіді працюють для мене в GitHub, але можуть не працювати на Heroku.

3. Актуальність

Ця відповідь актуальна для квітня 2018 року. В майбутньому дані цієї відповіді можуть бути застарілими.


4. Демонстрація

мій реальний проект .

Приклад успішного розгортання .

4.1. Завдання

Я розгортаю свій проект із відділення src до гілки dest того самого сховища.

Я хочу, щоб цей файл PaletteMira.suricate-profile:

  • Локальна машина - існує для всіх галузей,
  • src віддалене відділення - не існує,
  • dest віддалене відділення - існує.

Якщо я правильно зрозумів автора питання, у нього схоже завдання.

4.2. src

відділення джерел - СашаЯМЛ .

Частина .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-profileне в misc/.gitignore.

PaletteMira.suricate-profile не існує в цій галузі віддалено, але існує локально.

4.3. dest

відділення призначення - SashaDevelop

Частина .gitignore:

*.sublime-snippet

*.suricate-profileне в misc/.gitignore.

PaletteMira.suricate-profileіснує для цієї галузі віддалено та локально.

4.4. Кроки до відтворення

Я вмикаю сховище PaletteMira GitHub для Travis CI → Я встановлюю змінну середовища $GITHUB_TOKEN зі значенням - мій маркер GitHub → я беру на себе зобов’язання у своїй гілці src.

Якщо помилок немає, я повинен отримати очікувану поведінку .


0

Чи можете ви здійснити поштовх і відштовхнутися від Heroku?

Наприклад, додайте аудіо, натисніть їх на github і в heroku, видаліть файли з робочої копії на Heroku. Вийміть аудіо з репо, але не з диска, а потім натисніть цю зміну назад до github.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.