41

Я хочу показать некоторые из моих работ, загрузив их в свою учетную запись GitHub. Тем не менее, есть некоторые файлы, содержащие пароли, например, соединения с базой данных.

Есть ли способ пометить файл как недоступный для Git, чтобы он не мог появиться на GitHub?

5 ответов5

67

Есть ли способ пометить файл как недоступный для Git, чтобы он не мог появиться на GitHub?

Во-первых, нет никакого способа, чтобы некоторые файлы и коммиты были видны в вашем локальном Git-репозитории, но как-то не видны в GitHub; если у вас есть файл, зафиксированный в Git, он появится в GitHub.

Во-вторых, не существует простого и практичного способа пометить отдельный файл как «недоступный». Но, безусловно, есть способ игнорировать файл в репозитории Git: добавив файлы (включая их относительный путь, если необходимо), в файл .gitignore:

Файл .gitignore определяет намеренно неотслеживаемые файлы, которые Git должен игнорировать. Файлы, уже отслеженные Git, не затрагиваются; см. примечания ниже для деталей.

Создать простой .gitignore довольно просто, так как это простой текстовый файл. Так, например, если бы в вашем корне был файл config.php вы бы сделали это; при условии, что вы используете PHP, но концепция применима для любой установки. Также я использую Nano в качестве моего текстового редактора в этом примере, но не стесняйтесь использовать любой текстовый редактор, который вы обычно используете для этого:

nano .gitignore

И просто добавьте это имя файла в этот файл:

config.php

Сохраните его, и теперь Git просто проигнорирует этот файл.

Тем не менее, что мне нравится делать для таких настроек, как это - держать пример конфигурации / примера в чистом виде от деликатных спецификаций в репозитории, так что у меня есть некоторая ссылка на то, что формат файла конфигурации - это файл с именем примерно так:

config.SAMPLE.php

Таким образом, вы точно знаете, как настроить файл config.php через config.SAMPLE.php и вы можете быть уверены, что Git никогда не прикасается к самому config.php .

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

25

Вы также можете добавить хук предварительной фиксации для реализации проверок работоспособности. Каталог .git/hooks каждого репозитория git содержит несколько примеров сценариев.

Сценарий с именем pre-commit выполняется, если он существует перед каждым коммитом, и ненулевое возвращаемое значение отменяет коммит.

Например, у вас может быть простой скрипт вроде этого:

#! /bin/sh -e
git ls-files --cached | grep -qx 'filename' && { echo "Excluded file included in the commit" >&2; exit 1; }
exit 0

И если это filename совпадает, фиксация завершается неудачно.

12

Что сказал @JakeGould. В некоторых случаях вы также можете использовать специальные биты файлов, такие как skip-worktree или assume-unchanged которые могут быть установлены следующим образом; различия между ними см. в ответе «Переполнение стека»:

git update-index --assume-unchanged <file>

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

8

Используйте .gitignore как сказал @JakeGould. Кроме того, некоторая связанная информация:

  • .gitignore предотвращает отслеживание файлов; если они уже отслежены, используйте git rm --cached чтобы удалить их
  • файлы / шаблоны в $GIT_DIR/info/exclude также будут игнорироваться
  • Файлы / шаблоны в файле, указанном в core.excludeFile в ~/.gitconfig также игнорируются.

Смотрите официальную документацию Git для более подробной информации.

2

Чтобы расширить Jake и ответы 46: одна очень хорошая практика - иметь постоянное расширение, которое вы используете для файлов, в которые вы включаете личную информацию, и использовать .gitignore чтобы всегда исключать файлы с таким расширением глобально (используя файл .gitconfig как упоминалось в другом месте, для всегда игнорировать это для вашего пользователя).

Таким образом, вы можете иметь, например:

/projectname/mypasswords.exc 

и если вы исключили *.exc глобально, то вы знаете, что он не будет принят , даже если вы забудете отдельно исключить этот конкретный файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .