Может ли git игнорировать файл удаленно, включая его локально? - PullRequest
0 голосов
/ 24 мая 2018

Я работаю над проектом ASP.NET, где мне нужно иметь строки подключения для подключения к базам данных при локальной разработке на моем рабочем столе, но я не хочу проверять их в репозитории tfs в Интернете.Достаточно просто исключить файл ConnectionStrings.config, поместив его в файл gitignore.Но это также не позволяет сохранить его в моей локальной копии ветви, над которой я работаю, поэтому каждый раз, когда я переключаюсь между ветками локально, мой конфигурационный файл исчезает.удаленно

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Есть ли какой-нибудь способ совершать локально, но игнорировать удаленно?

Нет.

Точнее, не так, как вы думаете.То, что вы можете сделать, становится очевидным, когда вы понимаете, что в некоторой степени Git все равно не заботится о файлах .Git заботится о том, что переносит из репозитория в репозиторий, это commitits .Важной частью этого для алгоритмов Git, которые работают с графом коммитов, являются коммиты и их родительские / дочерние отношения.Файлы просто приходят для поездки.

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

...--o--o--o   <-- master
         \
          o--o   <-- develop

Каждый раунд o здесь представляет коммит.Вы создаете новую ветку work, которая указывает на такой же коммит, который develop указывает на:

...--o--o--o   <-- master, origin/master
         \
          o--o   <-- develop, origin/develop, work (HEAD)

(* origin/* имена - это ваш способ Git вспомнить, что вашGit видел на их Git, так что, пока ваш Git не получил от них ничего нового, ваши origin/* имена по-прежнему указывают на те же самые коммиты.)

Теперь вы выполняете некоторую работуна новой ветке и коммит.Давайте назовем этот новый коммит A, чтобы мы могли поговорить об этом (на самом деле он имеет большой уродливый хэш-идентификатор):

...--o--o--o   <-- master, origin/master
         \
          o--o   <-- develop, origin/develop
              \
               A   <-- work (HEAD)

Если вы git push из вашего репозитория Git, единственный новый коммит вы можете предложить им A.

Фиксация фактического идентификатора A, большой уродливый хеш, зависит от всего о commit A: сюда входят все файлы, прикрепленные к commit A, и тот факт, что коммит, на который указывает ваш develop, является коммитом A родителя.

Если вы дадите коммит A другому Git, вы обязаны предоставлять им каждый файл , который идет с коммитом A.Если у них нет всех файлов, у них нет коммита A.

Вы можете сделать новый коммит - давайте назовем это A' - вот и все как A, только немного отличается.Давайте сделаем A' таким, чтобы в нем не было файла.Его родитель такой же, как родительский A, и у него есть все другие файлы - помните, что каждый коммит представляет собой полный снимок всех файлов, которые A имеет.Давайте поместим A' на develop, сделав это с git checkout develop, а затем скопировав A, за исключением того, что мы опускаем один файл:

...--o--o--o   <-- master, origin/master
         \
          o--o   <-- origin/develop
             |\
             | A'  <-- develop (HEAD)
             \
               A   <-- work

Теперь вы можете заставить свой Git вызывать другой Gitи предложите это, не A, а A', через ваше имя develop.Если они решат принять его, ваш Git теперь будет помнить, что их develop указывает на A'.

Этот конкретный метод довольно болезненный в использовании.Это не тот путь, если вы можете найти какой-то другой путь.

0 голосов
/ 25 мая 2018

Мы нашли проблему.Этот проект имеет несколько веток разработки, и не во всех из них в их .gitignore добавлен ConnectionStrings.config.Итак, кто-то работал в одной из этих веток, используя ConnectionStrings.config для подключения к базе данных, и когда они проверяли свой код, они также проверяли в файле конфигурации.

Решение состояло из двух частей.Сначала нам пришлось обновить .gitignore всех активных веток разработки, чтобы они игнорировали файл конфигурации.Затем мы должны были удалить файл из кэша этой ветви.Не было очевидного способа сделать это через Team Explorer в Visual Studio, поэтому мы прекратили использовать параметр --cached в командной строке.

git rm -r --cached .\ProjectName\ConnectionStrings.config

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

0 голосов
/ 24 мая 2018

Игнорируемые файлы остаются на месте, если вы переключаете ветки.Если вы добавляете файл ConnectionStrings.config к .gitignore во всех ваших ветвях (или к общему предку), он всегда должен присутствовать (пока вы не выполните полное git clean).

Одна проблема заключается вчто если новый человек клонирует в первый раз, файл отсутствует.Для этого случая у некоторых людей есть файл конфигурации примера шаблона, например ConnectionStrings.config.example, с некоторыми поддельными примерами данных, которые вы фиксируете (не игнорируете).И после того, как вы впервые клонируете, выполните copy ConnectionStrings.config.example ConnectionStrings.config и измените реальный конфиг.

Еще одно решение (хотя и несколько разовое) заключается в том, что если у вас есть 3 разработчика, работающих на этом сайте, вы можете иметьодин ConnectionStrings.config с несколькими строками подключения их локальных сред с разными именами, такими как «BobDevDB», «AliceDevDB», «JohnDevDB», и каждый префикс имени напоминает имя их компьютера разработчика или имя пользователя Windows, так что вы можете во время выполнения выбратьправильная строка подключения.Таким образом, вам не нужно ничего игнорировать, и это всегда работает.

...