Используя git, как я могу игнорировать файл в одной ветке, но зафиксировать его в другой ветке?
у меня есть проект, который я развертывание на Heroku. Дерево исходного кода включает в себя кучу mp3-файлов (веб-сайт будет для проекта записи, в котором я принимал активное участие).
Я хотел бы поставить исходный код для него на GitHub, но GitHub имеет ограничение в 300 Мб на свои бесплатные учетные записи. Я не хочу использовать 50 МБ моего лимита на кучу mp3-файлов. Очевидно, я мог бы добавить их к .gitignore файл, чтобы держать их подальше от моего РЕПО.
тем не менее, я развертываю Heroku с помощью git push heroku. Файлы mp3 должны присутствовать в ветке, которую я нажимаю на Heroku, чтобы они были развернуты.
в идеале, я бы хотел, чтобы .gitignore mp3-файлы в моей локальной ветке master, так что когда я нажимаю это на GitHub, mp3-файлы не включены. Тогда я бы сохранил местную производственную ветвь, которая имеет mp3s, а не игнорируется. Чтобы развернуть, я бы объединил master в production, а затем подтолкнул производственную ветвь к В 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
в этот момент, Фу.игнорируется игнорируется в моей главной ветви, но он все еще присутствует, поэтому мой проект может его использовать.
$ git checkout -b unignored
$ cat /dev/null > .gitignore
$ git add Foo.ignored .gitignore && git commit -m "Unignore .ignored files"
теперь у меня есть ветка с этими файлами, как я хочу. Однако, когда я переключаюсь обратно на свою главную ветку, Foo.проигнорированный ушел.
у кого-нибудь есть предложения для лучшего способа установить это вверх?
Edit: просто чтобы уточнить, я хочу, чтобы файлы mp3 присутствовали в обеих ветвях, чтобы при локальном запуске сайта (используя любую ветвь) сайт работал. Я просто хочу, чтобы файлы игнорировались в одной ветке, поэтому, когда я нажимаю на GitHub, они также не нажимаются. Обычно.gitignore хорошо работает для такого рода вещей (т. е. сохраняя локальную копию файла, который не включается в толчок к удаленному), но когда я переключаюсь на ветку с проверенными файлами, а затем обратно в ветку когда файлы игнорируются, они исчезают.
8 ответов:
это решение, похоже, работает только для определенных, исправленных версий 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
важная подсказка: принятый ответ познанием.Ум не работает (больше, в течение нескольких лет, или, возможно, для ванильных версий Git); см. комментарии. Правильный ответ и обходной путь можно найти здесь:
https://stackoverflow.com/a/29583813/2157640
другой альтернативный обходной путь (работающий для моей конкретной проблемы, но требующий ручных операций тайника или реализации крючка) будет
git stash -u -a. Это утомительно когда различия велики.и, наконец, решение, с которым я сейчас собираюсь, - это разветвление моей виртуальной машины, в которой мы держим нашу среду разработки, и настройка
info/excludesсоответствующим образом для ветви, соответственно удаляя оскорбительные, незафиксированные файлы / папки.
Я настоятельно рекомендую рассмотреть возможность размещения этих MP3-файлов на S3. Если они будут частью вашего Heroku push (и, следовательно, частью вашего Heroku slug), это значительно замедлит время запуска dyno. Поскольку Heroku использует EC2, если файлы находятся на S3 и доступны только вашим приложением (если пользователи не связаны напрямую с S3), вы даже не будете платить за пропускную способность, только за хранение 50 МБ.
допустим, мы хотим игнорировать
buildпапка из всех других ветвей, кромеproductionфилиала . Как мы хотим нажатьbuildпапка в производстве.1) не включает
buildin .gitignore . Если вы это сделаете, он всегда будет игнорироваться для всех ветвей .2) создать файл
exclude_from_public_viewingвнутри./.git/infoпапку (эта папка уже существует)touch ./.git/info/exclude_from_public_viewing3) Внутри
exclude_from_public_viewingнаписать одну строку (как вы пытаетесь игнорироватьbuildдля всех филиалов).!build4)есть существующий файл
.git/info/exclude. Нам нужно добавить в него следующую строку.buildмы хотим игнорировать
buildпапка, но не добавил его.gitignore . Так как же git будет знать, что игнорировать ? Ответ заключается в том, что мы добавляем его вexcludeфайл и условно передавая этот файл вgit config5) Теперь мы должны условно unignore на
productionфилиала. для этого выполните следующие6) есть существующий файл называется
./.git/configнам нужно добавить следующее -a)
excludesfile = +info/excludeниже[core][core] excludesfile = +info/excludeб) создать новый раздел в конце
./.git/configкак[branch "production"] excludesfile = +info/exclude_from_public_viewingрешение 2
есть одно умное альтернативное решение . Допустим, вы хотите добавить на
productionбранч и игнорировать его во всех других ветках.1) добавьте его в свой .
2) в производстве бранч, делая git add, force add
buildпапкуgit add -f --all build/
вы пытались .gitignore будет отличаться в вашей отрасли?
вы должны быть в состоянии игнорировать то, что вы хотите на основе ветви вы находитесь до тех пор, пока файлы не отслеживаются на этой ветви.
можете ли вы совершить и нажать от Heroku?
например, добавьте аудио, нажмите их на github и в heroku, удалите файлы на рабочей копии на Heroku. Удалите звук из РЕПО, но не с диска, а затем нажмите это изменение обратно на github.
Github теперь имеет поддержку для хранения больших файлов, смотрите больше здесь https://git-lfs.github.com/
1. Резюме
- я использую Трэвис CI на установка(он поддерживает развертывание на Heroku)
я добавляю к моему
.travis.yml:before_deploy: - mv misc/.gitignore .gitignoreздесь
misc- любая папка, содержит другой.gitignore.
mvUNIX command переместить файл, перезапись, если файл уже существовать.когда Travis CI развертывает проект, Travis CI не будет нажимать на развертывание провайдера файлы и папки, которые игнорируют в
misc/.gitignore(не в оригинале.gitignoreисточников).
2. Ограничения
- этот ответ может не подходить для всех условий автора. Но этот ответ отвечает на вопрос "используя git, как я могу игнорировать файл в одной ветке, но зафиксировать его в еще одна ветка?"
- я не Пользователь Heroku, мои примеры для GitHub, а не для Heroku. Данные этот ответ работает для меня в GitHub, но не работает на Heroku.
3. Актуальность
этот ответ актуален для апреля 2018 года. В будущем данные этого ответа могут устареть.
4. Демонстрация
мой real проект.
пример успешного развертывания.
4.1. Задача
я развертываю свой проект из ветки src в ветку dest того же репозитория.
я хочу, чтобы файл
PaletteMira.suricate-profile:
- локальная машина-существует для всех ветвей,
- src remote branch - не существует,
- dest удаленная ветвь-существует.
если я правильно понял автор вопроса, у него аналогичная задача.
4.2. src
источники филиала - 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.филиала удаленно и локально.
4.4. Шаги для воспроизведения
я включаю PaletteMira GitHub репозиторий для Travis CI → я установить переменную среды
$GITHUB_TOKENС моей GitHub token → я делаю любую фиксацию в моей ветке src.если нет ошибок, я должен получить ожидаемое поведение.
Comments