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

646   8  

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) не включает build in .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) Теперь мы должны условно 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. Резюме

  1. я использую Трэвис CI на установка(он поддерживает развертывание на Heroku)
  2. я добавляю к моему .travis.yml:

    before_deploy:
    - mv misc/.gitignore .gitignore
    

    здесь misc - любая папка, содержит другой .gitignore.

    mv UNIX command переместить файл, перезапись, если файл уже существовать.

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


2. Ограничения

  1. этот ответ может не подходить для всех условий автора. Но этот ответ отвечает на вопрос "используя git, как я могу игнорировать файл в одной ветке, но зафиксировать его в еще одна ветка?"
  2. я не Пользователь 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

    Ничего не найдено.