Белый список каталогов с .gitignore

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

# Blacklist everything
*
# Whitelist directories of interest and their contents
# stage files in directory A/ recursively
!A/
!A/*
# stage files in directory B/B1/ recursively (without staging files in B/)
!B/B1/
!B/B1/**
# Whitelist files of interest
# stage only the .md files (not .txt files)
!*.md

Как написать файл .gitignore, который содержит два каталога в белом списке?

Приведенный выше файл gitignore основан на .gitignore игнорировании папки из белого списка

Вот каталог, в котором я тестировал .gitignore:

$ find A B C
A
A/a.md
A/a.txt
A/A1
A/A1/a1.md
A/A1/a1.txt
B
B/b.md
B/b.txt
B/B1
B/B1/b1.md
B/B1/b1.txt
C
C/c.md

Вот как я тестировал файл .gitignore:

$ find A B C            #list all paths
$ git init
                        #test .gitignore:
$ git add . --dry-run   #show what would be staged
                        #edit gitignore and test again

Ожидаемый результат:

$ git add . --dry-run
add 'A/A1/a1.md
add 'A/a.md
add 'B/B1/b1.md

person wolfv    schedule 30.01.2015    source источник


Ответы (3)


Этот файл .gitignore включает в белый список каталоги A и B/B1 и исключает файлы .txt:

#exclude files and directories in top directory
/*

#include the A directory
!/A

#include the B directory
!/B
#exclude files and directories in B
/B/*
#include the B/B1 directory
!/B/B1

#ignore .txt files
*.txt

Он основан на последнем примере в http://git-scm.com/docs/gitignore.

person wolfv    schedule 30.01.2015

Вы можете решить свою проблему с помощью нескольких файлов .gitignore:

# .gitignore
*
!.gitignore
!A/
!A/*
!B/
!B/*
!*.md

# A/.gitignore
!*

# B/.gitignore
!*
person AndreyAkinshin    schedule 30.01.2015

Это то, что я сделал, основываясь на информации в вопросе с перекрестными ссылками и настройке каталога в этом вопросе:

$ mkdir junk
$ cd junk
$ git init
Initialized empty Git repository in /Users/jleffler/soq/junk/.git/
$ mkdir -p A/A1 B/B1 C
$ > A.md
$ > A/a.md
$ > A/a.txt
$ > A/A1/a1.md
$ > A/A1/a1.txt
$ > B/b.md
$ > B/b.txt
$ > B/B1/b1.md
$ > B/B1/b1.txt
$ > C/c.md
$ cat > .gitignore
*
!A/
!A/**
!B/
!B/**
!*.md
$ git status
On branch master

Initial commit

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

    A.md
    A/
    B/

nothing added to commit but untracked files present (use "git add" to track)   
$ git add A.md A B
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   A.md
    new file:   A/A1/a1.md
    new file:   A/A1/a1.txt
    new file:   A/a.md
    new file:   A/a.txt
    new file:   B/B1/b1.md
    new file:   B/B1/b1.txt
    new file:   B/b.md
    new file:   B/b.txt

$

После добавления A и B все файлы внутри ожидают добавления. Обратите внимание, что файл .gitignore содержит каталоги (косая черта в конце не обязательна, AFAICT), а затем имена !A/**. Двойная звезда является ключом к рекурсивному поиску.


Я использовал git reset (на самом деле никогда не делал коммита) и повозился с .gitignore. Я не уверен, что цели являются самосогласованными в данный момент. Однако этот модифицированный файл .gitignore:

*
!A/
#!A/**.md
!B
!B/B1
#!B/B1/**.md
!*.md
B/b.md

плюс git add A.md A B дает:

$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   A.md
    new file:   A/a.md
    new file:   B/B1/b1.md

$

Вы должны иметь возможность играть с вариациями показанных тем, чтобы получить желаемый результат. Строка !*.md отслеживает все файлы .md. Строка B/b.md, конечно же, игнорирует B/b.md. Файл .md в C игнорируется, потому что C занесен в черный список (через *).

person Jonathan Leffler    schedule 30.01.2015
comment
Джонатан, извините, я не сделал требования более четкими. Ваш .gitingnore близок к этому, но есть два недостатка: 1) это постановка B/b.md; есть ли способ разместить только каталоги A/ и B/B1/ (без размещения файлов в B/)? 2) Это промежуточные файлы .txt; есть ли способ поставить только файлы .md? - person wolfv; 30.01.2015
comment
Я расследую. Пожалуйста, обновите вопрос, чтобы прояснить эти моменты. Вы хотите включить B/b.md, потому что это файл .md, или исключить, потому что он находится в B? - person Jonathan Leffler; 30.01.2015
comment
stage только файлы .md (не файлы .txt) являются глобальными. - person wolfv; 30.01.2015