Git игнорировать исключение не работает, как хотелось бы - PullRequest
12 голосов
/ 08 сентября 2010

WinXP + mysisGit1.7

В моем файле .gitignore, но все еще не видно, что Demos/path/to/file/file.cpp отслеживается git.

У меня есть записи ниже:

Demos/
!Demos/path/to/file/file.cpp

Абсолютный путь: c:\Project\Demos\path\to\file\file.cpp

Что может быть не так?Пожалуйста, помогите, спасибо.

РЕДАКТИРОВАТЬ:

Я обнаружил, как mysisGit .gitignore работает на WindowsXP может игнорировать только определенный тип файла, а затем исключить некоторые файлы с таким же типом.Например:

*.bak
!tracking.bak
!/path/to/file/tracking2.bak

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

/folderUnderRepoRoot/
!/folderUnderRepoRoot/tracking.cpp

Нор

anyFolderNamedLikeThis/
!anyFolderNamedLikeThis/tracking.cpp
!/anyFolderNamedLikeThis/tracking.cpp

Однако, я считаю, что есть исключение.Существует обходной способ исключения файлов прямо под игнорируемой папкой (а не в ее подпапке). Это работает.

/folderUnderRepoRoot/*
/folderUnderRepoRoot/tracking.cpp

Но этот способ ограничен только в том случае, если файл отсутствует в любой подпапке, поэтому он не очень полезен.

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

Вот другой поток , у которого была похожая проблема.

Ответы [ 4 ]

10 голосов
/ 24 августа 2014

Ваше исключение .gitignore не работает, поскольку "Невозможно повторно включить файл, если исключен родительский каталог этого файла" ( source ).Это «причуда, связанная с производительностью в Git» ( source ).

В качестве уродливого, но функционального обходного пути, сделайте это для каждого каталога в пути к файлу:

  1. Исключить содержимое каталога.
  2. Повторно включить подкаталог, ведущий к вашему файлу (соответственно, наконец, повторно включить ваш файл).

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

Demos/*
!Demos/path/

Demos/path/*
!Demos/path/to/

Demos/path/to/*
!Demos/path/to/file/

Demos/path/to/file/*
!Demos/path/to/file/file.cpp

Примечания:

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

1 голос
/ 27 ноября 2013

Добавьте в .gitignore следующее:

folderUnderRepoRoot/**/*
!folderUnderRepoRoot/tracking.cpp

Но убедитесь, что в папку git index добавлен хотя бы один файл из папки folderUnderRepoRoot.

0 голосов
/ 05 октября 2015

Если это всего лишь один файл, я бы не стал изменять .gitignore

Следующее должно игнорировать .gitignore и позволить вам добавить файл

git add -f Demos/path/to/file/file.cpp
0 голосов
/ 08 сентября 2010

Можете ли вы попробовать заменить его на !/Demos/path/to/file/file.cpp (обратите внимание на косую черту после восклицательного знака) и попробовать снова?

...