Используя git, как игнорировать файл в одной ветке, но передать его в другой ветке?

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

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

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

В идеале я хотел бы .gitignore mp3 файлов в моей локальной ветки мастера, чтобы, когда я нажимаю на 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 ушел.

У кого-нибудь есть предложения по улучшению способа настройки?

Edit: просто чтобы уточнить, я хочу, чтобы файлы MP3 присутствовали в обеих ветвях, поэтому, когда я запускаю сайт локально (используя любую ветку), сайт работает. Я просто хочу, чтобы файлы игнорировались в одной ветки, поэтому, когда я нажимаю GitHub, они тоже не толкаются. Обычно .gitignore хорошо работает для такого рода вещей (то есть, сохраняя локальную копию файла, который не входит в push на удаленный), но когда я переключаюсь на ветку с проверенными файлами, а затем обратно ветвь с файлами игнорируется, файлы исчезают.

Ответ 1

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

Ответ 2

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

fooobar.com/questions/50669/...

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

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

Ответ 3

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

Ответ 4

Допустим, мы хотим игнорировать папку 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 нам нужно добавить следующее:

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

[core]
     excludesfile = +info/exclude

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

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

Решение 2

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

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

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

Ответ 5

Вы пробовали использовать .gitignore в своей ветке?

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

Ответ 6

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 remote branch - существует.

Если я правильно понял автора вопроса, у него схожая задача.

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 → Я установил переменную окружения $GITHUB_TOKEN со значением - мой токен GitHub → Я делаю фиксацию для своей ветки src.

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

Ответ 7

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

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

Ответ 8

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