Git ignore - Как вы переопределяете исключение на ignore-all?

Я хочу создать git-репо из моих настроек bash и плагинов и еще много чего. Я проигнорировал все (строка 0) и затем вручную добавил файлы / папки, которые я хочу в репо. (Я должен сделать это так, потому что репо в моем~ Папка.) Я хочу игнорировать все цветовые профили в каталоге .vim / colors /, но я хочу включить один файл, который я использую (apprentice.vim).

.vim/colors/* Строка, кажется, не работает - она ​​не игнорирует файлы вообще. С помощью!!.vim/colors/* тоже не работает Как мне сделать так, чтобы он переопределял все предыдущие правила и игнорировал папку colors, а затем позволял игнорировать файл apprentice.vim?

/*

*.swp

!.gitignore

!.bashrc
!.bash_profile

!.vimrc
!.vim
.vim/colors/* # Don't include all of the other color schemes
!.vim/colors/apprentice.vim
 VonC29 мая 2016 г., 09:42
@torek актуальная проблемаcolors/папка игнорируется. Увидетьмой ответ ниже
 torek29 мая 2016 г., 09:44
@VonC: ах, да, этот всегда меня сбивает с толку. Я стараюсь никогда не допускать совпадения целых каталогов в.gitignore файлы.
 torek29 мая 2016 г., 09:29
Это буквальная копия.gitignore файл с комментарием как часть строки? Если это так, то проблема в том, что комментарии должны быть отдельными строками.

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

Решение Вопроса

# comment на той же линии, что и.vim/colors/*, но здесь есть альтернатива.

Основное правило для gitignore:

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

Это означает:
(при условии, что элементы еще не версионированы, в этом случае вам нужноgit rm --cached их в первую очередь)

вам нужно игнорировать всефайлы рекурсивно: это**'исключить всепапки рекурсивно: это**/'исключить файл, который вы хотите (который будет работать, потому что его родительская папка также не игнорируется)

Результат:

/**
!/**/
!exclude what you want to *not* be ignored
# for instance
.vim/colors/* # Don't include all of the other color schemes
!.vim/colors/apprentice.vim

Проверьте, что есть и не игнорируетсяgit check-ignore -v (-v это важно):

git check-ignore -v -- afile

Это проще, чем не игнорировать подпапку вручную, особенно когда содержание подпапки, которое нужно игнорировать, имеет несколько уровней: исключить файл вa/b/cсначала нужно игнорировать!/a, затем!/a/b, затем!/a/b/c)

Иллюстрация / тест:

C:\Users\vonc\prog\git\tests>git init i
Initialized empty Git repository in C:/Users/vonc/prog/git/tests/i/.git/

C:\Users\vonc\prog\git\tests>cd i

C:\Users\vonc\prog\git\tests\i>mkdir .vim\colors

C:\Users\vonc\prog\git\tests\i>touch .vim\colors\apprentice.vim

C:\Users\vonc\prog\git\tests\i>git st
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .vim/

nothing added to commit but untracked files present (use "git add" to track)

просто.gitignore с/* правило:

C:\Users\vonc\prog\git\tests\i>sbt .gitignore
/*

C:\Users\vonc\prog\git\tests\i>git st
On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

Добавим!.gitignore.
.gitignore Теперь можно отслеживать.

C:\Users\vonc\prog\git\tests\i>git st
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .gitignore

nothing added to commit but untracked files present (use "git add" to track)

Но если я добавлю:

.vim/colors/*
!.vim/colors/apprentice.vim

.vim все содержаниееще проигнорировано:

C:\Users\vonc\prog\git\tests\i>git st
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .gitignore

nothing added to commit but untracked files present (use "git add" to track)

Давайте посмотрим, почему сgit check-ignore:

C:\Users\vonc\prog\git\tests\i>git check-ignore -v -- .vim\colors\apprentice.vim
.gitignore:1:/* ".vim\\colors\\apprentice.vim"

Добавление!.vim работает, потому что он игнорирует папку, позволяя применять другие правила в этой папке.

Тем не менее, это проще:

/**
!/**/
!.gitignore
.vim/colors/*
!.vim/colors/apprentice.vim
 Dylanthepiguy30 мая 2016 г., 09:28
Я пометил это как правильный, хотя все мои другие корневые папки (документы, загрузки и т. Д.) Отображаются как unstaged от git, когда я использую `/ ** \ n! / ** /` (не воспринимайте "\ n" буквально ). Я решил не использовать git-репо для этой цели, потому что, когда я нахожусь в любом пути в моем домашнем каталоге, git-статус будет показывать состояние репозитория (когда там нет другого git-репо), что довольно раздражает.
 VonC30 мая 2016 г., 10:07
@Dylanthepiguy в локальном git-репо, теперь у вас должны появиться все папки Windows: Загрузки, документы, ...). Каков ваш текущий рабочий путь, когда вы делаетеgit status а ты видишь эти папки?
 VonC30 мая 2016 г., 21:51
@Dylanthepiguy Вы пробовали с/** !/**/ подход, который я упоминаю в своем ответе в конце?
 Dylanthepiguy30 мая 2016 г., 10:06
О, я ужеrm -rf '.git папку. У меня не было никаких других мерзавцев, поскольку я выдал ошибку «роковое: не репозиторий» (что-то в этом роде). Я не пытался добавить их, но появится ли какая-либо папка, если она будет проигнорирована?
 Dylanthepiguy30 мая 2016 г., 21:35
Несмотря на это, я повторно запустил репозиторий для тестирования, и папка Dropbox, Downloads и т. Д. Не отображаются в состоянии git. Тем не менее.vim папка также не отображается в статусе
 VonC30 мая 2016 г., 09:29
@ Dylanthepiguy unstaged? Чтобы ты могgit add их? Эти папки не должны отображаться, если вы не сделали git init в неправильном месте (как в C :). У вас есть.git папка где-то еще?
 Dylanthepiguy30 мая 2016 г., 10:35
Я сделал git-статус где-то в ~ / Dropbox / Programming /, но, как я уже сказал, я уже сделалrm -rf в папке ~ / .git, поэтому я не могу сейчас воспроизвести его

*.swp будет покрыт/* и комментарий не находится на своей собственной линии.

Как видите, все остальные .vim / цвета игнорируются.

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

git rm --cached ./.vim/colors/*
git add ./.vim/colors/
git commit -m"Unstaged .vim/colors"

Финальный .gitignore для использования

/*
!.gitignore

!.bashrc
!.bash_profile

!.vimrc
!.vim
.vim/colors/*
!.vim/colors/apprentice.vim
 fyrye29 мая 2016 г., 09:59
Я тестировал с мерзавцем1.9.4 а также2.8.3 который применяется к тем же правилам в соответствии со статьей, на которую вы ссылаетесь. Опять же, мой скриншот доказывает, что он работает. Восстановите его, используя те же правила, и все получится так же, как на скриншоте, который я сделал. Удалить# Don't include all of the other color schemes из вашего gitignore и запустить свойgit check-ignore -v снова.
 fyrye29 мая 2016 г., 09:44
Это с!.vim/colors/apprentice.vim вот почему/* !.gitignore работает, как и другие.
 VonC29 мая 2016 г., 09:50
Нет, это не будет работать, я только что проверил (git 2.8.3).git check-ignore -v -- .vim/colors/apprentice.vim правильно говорит, что игнорировать из-за/* править./* !.gitignore работает потому что/ сама (папка) не игнорируется. Только его содержание. В пределахтак же папку, вы можете игнорировать. Не во вложенных подпапках.
 VonC29 мая 2016 г., 10:03
Я согласен, я пропустил!.vim Правило, которое игнорировать.vim папка. Я по-прежнему считаю, что игнорирование всех подпапок проще (вам не нужно игнорировать все подпапки по одной вручную)
 fyrye29 мая 2016 г., 09:48
@VonC дополнительно посмотрите на структуру папок размещенного мною изображения, которое является выводом из.git обработка файла игнорирования - доказательство того, что он работает. Однако сcomment в той же строке вызовет игнорирование этой строки .git при обработке файла .gitignore.
 VonC29 мая 2016 г., 09:40
Это не будет работать, потому чтоcolors/ сама папка игнорируется. Любое правило в пределахcolors/ папка также будет игнорироваться: как только папка будет проигнорирована, git вообще не заглядывает в нее.
 fyrye29 мая 2016 г., 10:07
Очень согласен с этим. Упрощает управление этим, поскольку вы можете уточнить, что игнорируется, вместо того, чтобы проверять, что нет. Однако случай пользователя в каталоге профиля пользователя может сделать это невозможным.

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