Сделайте так, чтобы символическая ссылка (actual.file) указывала на «замороженный» файл release.file, когда вы хотите обновить его вручную или просто скопировать изменения из local.file в release.file.

ожусь в ситуации, когда я хочу открыть исходный код своего проекта, однако есть один исходный файл, для которого я хочу выпустить «чистую» версию, но использовать отдельную версию локально. Есть ли в git функция, с помощью которой я могу просто зафиксировать файл один раз, и теперь он перестает искать изменения в этом файле?

Я пытался добавить файл в .gitignore, но после первого раза, когда я делаюgit add -f а такжеgit commit на файл, и я продолжаю редактировать его снова,git status показывает файл как измененный Идеальным вариантом было бы, чтобы git не показывал этот файл как измененный с этого момента, даже если я его редактировал.

Мне также было бы интересно узнать, как другие справляются с «очисткой» своих кодовых баз закрытого кода / данных, прежде чем отправлять их в репозиторий с открытым исходным кодом, особенно в Git.

 Steven17 янв. 2011 г., 06:52
Для этого есть внутренние причины, но, к вашему сведению, причина, по которой ваш.gitignore уловка не сработала в том, что.gitignore применяется только когда git ищет неверсионные файлы для добавления. Это означает, что оно будет (1) отображаться вgit status и (2) будут добавлены, когда выgit add ..

Ответы на вопрос(5)

update-index, вот документы.

Вот основной пример замораживания файлаfoo.rb:

git update-index --assume-unchanged foo.rb

Затем, чтобы вернуть его:

git update-index --no-assume-unchanged foo.rb

Или для простоты добавьте его в.gitconfig

freeze = update-index --assume-unchanged
thaw = update-index --no-assume-unchanged
...
git freeze foo.rb
git thaw foo.rb

Примечание. Этот ответ был изначально предоставлен @TheAmpersand в комментариях выше. Я думал, что это было достаточно важно, чтобы формализовать.

ветке. Проделайте свою работу в этой ветке, затем выполните ребазинг, игнорируя ваши изменения обратно в реальную ветку, в которой происходит разработка.

Вы можете сделать это с Git'sредкая проверка характерная черта. Запустите следующие команды в репо, где вы хотите специальный, без отслеживанияlocal.txt файл:

git config core.sparsecheckout true
echo '*' >.git/info/sparse-checkout
echo '!local.txt' >>.git/info/sparse-checkout
git read-tree --reset -u HEAD

Это будет первымудалять существующийlocal.txt файл. Но теперь это игнорируется с точки зрения Git, так что вы можете поместить туда машинно-ориентированный, и Git вас не побеспокоит.

Затем вы можете добавлять и управлять опубликованнымиlocal.txt файл из некоторыхДругие репозиторий. Git с радостью отследит этот файл и сохранит его в репозитории, но на компьютере с указанной выше конфигурацией разреженного извлечения Git будетигнорировать местныйlocal.txt файл в этом рабочем каталоге, даже если он отличается от того, что находится в хранилище.

 amree12 апр. 2011 г., 00:38
Ой, спасибо, попробую это
 TheAmpersand17 янв. 2013 г., 18:25
Я обнаружил, что этот метод очень надежный. Больше, чем другие методы, которые я видел, используютgit update-index --assume-unchanged или жеgit update-index --skip-worktree, Ура!
 Greg Hewgill11 апр. 2011 г., 21:01
@foo: конечно, отредактируйте.git/info/sparse-checkout файл, удалите!local.txt линии и перезапуститеgit read-tree команда.
 Shunya18 сент. 2013 г., 08:14
Вау, это помогло мне. Отличная информация. Спасибо
 amree10 апр. 2011 г., 07:54
Есть ли способ отменить это?

используя символические ссылки. Кажется, вы ищете возможности управления версиями вместо управления файлами конфигурации, но я уверен, что эта небольшая стратегия может помочь. Вот шаги, которые я обычно делаю:

Скажем, файл, который вы хотите обновить локально (а не для совместного использования), называется «local.file», а файл, который вы хотите освободить (в дикой природе), - «release.file» ... Вам необходимо создать символическую ссылку file, давайте назовем этот символьный файл ссылки 'actual.file'. Файл символической ссылки будет указывать на local.file или release.file в любой момент времени (или будет отсутствовать, если вы только что клонировали репо).

gitignore local.file и actual.file, чтобы они не отслеживались, поскольку вы не хотите, чтобы они отслеживались или выпускались. actual.file всегда указывает на файл, с которым вы хотите работать.Сделайте так, чтобы символическая ссылка указывала на local.file, когда вы работаете над «не замороженным» версионным файлом.Сделайте так, чтобы символическая ссылка (actual.file) указывала на «замороженный» файл release.file, когда вы хотите обновить его вручную или просто скопировать изменения из local.file в release.file.

Позвольте мне сделать дополнение, которое учитывает то, что я считаю своими целями высокого уровня:

Не выпускайте локальные данные в дикую природуВыпустить чистую версию в дикую природу

Простейший (и, по моему опыту, наиболее подтвержденный) способ сделать это - использовать следующую структуру:

версированное
./application.code
./config.code
./config.local.code.sample
./.gitignore

application.code

include('./config.code')
if is_file('./config.local.code')
  include('./config.local.code')
end

config.code

username = 'root'
password = 'password'

config.local.code.sample

username = 'replace with your local username and rename file to config.local.code'
password = 'replace with your local password and rename file to config.local.code'

.gitignore

config.local.code
Неверсионный (опционально)
./config.local.code # will not be picked up by git due to .gitignore

config.local.code

username = 'Suan'
password = 'myownpass'
Результат

Как видите, вы избегаете освобожденияconfig.local.code, который на самом деле содержит вашу конфиденциальную информацию, в дикую природу. Конфигурация по умолчанию (клонированная прямо с пульта) будет работать для разумного, если редко, случая, когда имя пользователяroot и парольpassword действует. И удачно названныйconfig.local.code.sample предоставляет местные инструкции по настройке.

 ATL_DEV23 янв. 2014 г., 19:33
Где эти файлы живут?

Ваш ответ на вопрос