Используя git, как мне проигнорировать файл в одной ветви, но зафиксировал ли он в другой ветви? - PullRequest
146 голосов
/ 03 декабря 2009

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

Я бы хотел разместить исходный код для него на GitHub , но GitHub имеет ограничение 300 МБ для своих бесплатных учетных записей. Я не хочу использовать 50 МБ своего лимита на кучу mp3-файлов. Очевидно, я мог бы добавить их в файл .gitignore, чтобы они не попали в мой репозиторий.

Однако я развернул в Heroku, используя git push heroku. Файлы MP3 должны присутствовать в ветке, которую я отправляю в Heroku, чтобы их можно было развернуть.

В идеале, я бы хотел .gitignore файлы mp3 в моей локальной ветке master, чтобы при отправке этого файла на GitHub файлы mp3 не включались. Тогда я бы оставил местную производственную ветку, в которой mp3 записаны, а не проигнорированы. Для развертывания я включил бы master в производство, а затем отправил производственный филиал в 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 хорошо работает для такого рода вещей (т.е. для сохранения локальной копии файла, который не включается в push-уведомление на удаленном компьютере), но когда я переключаюсь на ветку с проверенными файлами, а затем возвращаюсь к ветка с игнорируемыми файлами, файлы исчезают.

Ответы [ 8 ]

79 голосов
/ 28 октября 2010

Это решение работает только для определенных исправленных версий 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 / запись / 1423976659 / HOWTO-gitignore-для-разных ветвей

16 голосов
/ 01 сентября 2016

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

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

Другой альтернативный обходной путь (работающий для моей конкретной проблемы, но требующий ручных операций хранения или реализации хука) будет git stash -u -a. Это утомительно, когда различия велики.

И, наконец, решение, с которым я сейчас работаю, состоит в том, чтобы разбудить мою виртуальную машину, в которой мы поддерживаем нашу среду разработки, и соответствующим образом настроить info/excludes для ветви, соответственно удалив поврежденные, незафиксированные файлы / папки.

14 голосов
/ 09 декабря 2009

Я бы настоятельно рекомендовал рассмотреть возможность размещения этих файлов MP3 на S3. Если они будут частью вашего толчка Heroku (и, следовательно, частью вашего слизняка Heroku), это значительно замедлит время запуска динамометра. Поскольку Heroku использует EC2, если файлы находятся на S3 и доступны только вашему приложению (если пользователи не имеют прямой связи с S3), вы даже не будете платить никакую плату за пропускную способность, только плата за хранение 50 МБ.

12 голосов
/ 02 сентября 2016

Допустим, мы хотим игнорировать папку 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. Так как мерзавец будет знать, что игнорировать? Ответ: мы добавляем его в файл exclude и условно передаем этот файл в git config

5) Теперь необходимо условно игнорировать папку build для production ветви. для этого выполните следующее

6) Существует существующий файл с именем ./.git/config, нам нужно добавить следующее -

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

[core]
     excludesfile = +info/exclude

b) Создать новый раздел в конце ./.git/config как

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

Решение 2

Существует одно умное альтернативное решение. Допустим, вы хотите добавить папку build/ в ветку production и игнорировать ее во всех остальных ветках.

1) Добавьте его в файл gitignore.

2) В производственной ветке, делая git add, принудительно добавляем папку build: git add -f --all build/

4 голосов
/ 03 декабря 2009

Вы пробовали, чтобы .gitignore в вашей ветке отличался?

Вы должны иметь возможность игнорировать то, что вы хотите, на основе ветви, в которой вы находитесь, если файлы не отслеживаются в этой ветви.

2 голосов
/ 24 апреля 2018

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. ЦСИ

ветка источников - SashaYAML .

Часть .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 → I установить переменную среды $GITHUB_TOKEN со значением - мой токен GitHub → Я делаю любые коммиты в мою ветку src.

Если ошибок нет, я должен получить ожидаемое поведение .

0 голосов
/ 13 июля 2016

Github теперь поддерживает хранилище больших файлов, подробнее здесь https://git -lfs.github.com /

0 голосов
/ 05 декабря 2009

Можете ли вы совершить и оттолкнуть от Heroku?

например. Добавьте аудио, вставьте их в github и в heroku, удалите файлы из рабочей копии на Heroku. Удалите аудио из репозитория, но не с диска, затем верните это изменение в github.

...