git pull, зберігаючи локальні зміни


132

Як я можу безпечно оновити (потягнути) проект git, зберігаючи певні файли недоторканими, навіть якщо є зміни вгору?

myrepo / config / config.php

Чи є спосіб, навіть якщо цей файл змінювався на віддалений час, коли я git pull, все інше оновлюється, але цей файл є незмінним (навіть не об'єднаним)?

PS. Мені потрібно робити те, що я прошу, тому що я пишу лише сценарії розгортання на основі git. Не можу змінити конфігураційні файли на шаблони.

Отже, мені потрібен спосіб написати сценарії оновлення, які не втратять те, що було змінено локально. Я сподівався на щось таке просте, як:

git assume-remote-unchanged file1
git assume-remote-unchanged file2

тоді git pull


Чи внесені зміни config.php?
Марк Лонгейр


Це не вчинено. Я б швидше не повинен був
Джонні Еверсон

@JhonnyEverson: Це той самий загальний клас проблеми (у вас є файл конфігурації, і ви не хочете здійснювати конкретні налаштування, але структуру файлу конфігурації потрібно відстежувати.)
Daenyth,

Відповіді:


248

Існує просте рішення на основі Git stash. Заховайте все, що ви змінили, витягніть все нове, застосуйте свій приклад.

git stash
git pull
git stash pop

На скрипті можуть виникнути конфлікти. У випадку, який ви описуєте, насправді виникне конфлікт config.php. Але вирішити конфлікт легко, тому що ти знаєш, що те, що ти вкладаєш у скриньку, - те, що ти хочеш. Тож зробіть це:

git checkout --theirs -- config.php

5
що git checkout - їх команда дуже заплутана. Це робило те, що я хотів одного разу, і щось справді погане інший раз. Є якась хороша документація на це?
Міліметричний

3
Так, іноді "їх" і "наше" можуть бути заплутаними. У git merge"нашому" - це те, що зараз знаходиться у робочому каталозі. Але для git rebase(або git rebase -onto) значення може змінитися.
GoZoner

1
git stash , git pull , git stash apply Ви можете скинути скриньку за допомогою: git stash dropПісля того, як ви успішно
з’єднаєте

11
Справа в git полягає в тому, що ви повинні розуміти, що це робити. Інша річ, що стосується git, полягає в тому, що навіть розумним людям часто дуже важко зрозуміти, що збирається робити.
Бред Томас

1
Ви повинні перевірити, чи є в нас справді що-небудь сховано. В іншому випадку ви б поп приховували зміни раніше git stash.
Йорн Реймердес

15

Якщо у вас є файл, який повинен бути налаштований більшістю знімачів, перейменуйте файл на щось подібне config.php.templateта додайте config.phpдо свого .gitignore.


5
Перевірте цю відповідь і ви .gitattributesзавжди можете зберігати зміни під час злиття.
KurzedMetal

Це більше схоже на те, що мені було потрібно. Річ із шаблоном - це елегантне рішення, але я боюся, що я не можу це використовувати, оскільки я просто пишу сценарії розгортання.
Джонні Еверсон

6

Оновлення: це буквально відповідає на поставлене запитання, але я думаю , що відповідь KurzedMetal - це дійсно те, що ви хочете.

Якщо припустити, що:

  1. Ти на гілці master
  2. Верхній відділення знаходиться masterвorigin
  3. У вас немає невідомих змін

.... ви можете зробити:

# Do a pull as usual, but don't commit the result:
git pull --no-commit

# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php

# Create the commit:
git commit -F .git/MERGE_MSG

Ви можете створити псевдонім для цього, якщо вам потрібно робити це часто. Зауважте, що якщо ви змінили зміни config/config.php, це призведе до їх викидання.



1

Щоб відповісти на запитання: якщо ви хочете виключити певні файли каси, ви можете скористатися розрідженою касою

1) .git/info/sparse-checkoutВизначте, що ви хочете зберегти. Тут ми хочемо, щоб усі (*), але (зверніть увагу на знак оклику) config.php:

 /*
 !/config.php

2) Скажіть git, що хочете взяти до уваги розрядний замовлення

 git config core.sparseCheckout true

3) Якщо ви вже отримали цей файл локально, виконайте те, що git робить на розрідженій касі (скажіть, він повинен виключити цей файл, встановивши на ньому прапор "пропустити робоче дерево")

git update-index --skip-worktree config.php

4) Насолоджуйтесь сховищем, у якому є ваш файл config.php - незалежно від змін у сховищі.


Зверніть увагу, що значення конфігурації НЕ БУДУТЬ у контролі джерела:

  • Це потенційне порушення безпеки
  • Це спричиняє такі проблеми, як ця для розгортання

Це означає, що ОБОВ'ЯЗКОВО виключати їх (ставити їх у .gitignore перед першим вступом) та створювати відповідний файл у кожному екземплярі, де ви перевіряєте свою програму (копіюючи та адаптуючи файл "шаблону")

Зауважте, що після того, як файл приймає git, .gitignore не матиме жодного ефекту.

Зважаючи на те, що після того, як файл знаходиться під контролем джерела, у вас є лише два варіанти (): - відновити всю свою історію, щоб видалити файл (з git filter-branch) - створити команду, яка видаляє файл. Це як битися з програшним боєм, але, ну, іноді доводиться з цим жити.


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