Подтвердить что ты не робот

Git Не будет игнорировать каталог

Я хочу отслеживать только определенные каталоги в git в более крупном проекте, где большинство каталогов будут исключены, и только некоторые из них будут отслеживаться. Итак, я хотел использовать не-операторы в моем .gitignore или исключая файл, ja?

Почему это происходит:

% mkdir wtfgit
% cd wtfgit 
% git init
Initialized empty Git repository in /home/foobar/wtfgit/.git/
% mkdir iwantthesefiles
% touch iwantthesefiles/foo
% mkdir idontwantthesefiles
% touch idontwantthesefiles/bar
% vim .gitignore
% cat .gitignore 
*
!iwantthesefiles/        
% git add --all
% git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

Синтаксис "не" отлично работает для файлов в самом высоком каталоге.

% touch baz          
% vim .gitignore
% cat .gitignore 
*
!iwantthesefiles/
!baz
% git add --all 
% git status    
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   baz
#

Как я могу получить это, чтобы дать мне baz и foo в качестве git отслеживаемых файлов? (В принципе, как работает каталоги НЕ-стиля?) Кажется, это не так.)

Спасибо!

4b9b3361

Ответ 1

Возрождение старого сообщения, если кто-то еще наткнулся на это:

Если вы хотите игнорировать все папки/файлы в текущем каталоге, используйте ведущую косую черту (/*/ для каталогов или /* для файлов); else Git будет игнорировать шаблон рекурсивно, что также приведет к игнорированию файлов в незарегистрированных каталогах...

С учетом этого шаблон !directory/ невосприимчивы к каталогам.

Ответ 2

Чтобы принудительно добавить папки, которые игнорируются, используйте:

git add -f my-ignored-folder

Ответ 3

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

$ cat > .gitignore << EOF
*
!bar
EOF
$ git add -f iwantthesefiles

Это позволит трек-лист git и все в каталоге iwanthesefiles.

Ответ 4

Git ведет себя следующим образом: он не будет игнорировать файл, который находится в репозитории. Кроме того, чтобы исключить каталоги, закончите слэш. Как вы можете видеть в следующем примере, отслеживались только iwantthesefiles/baz.

$ cat .gitignore
*/
!iwantthesefiles
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .gitignore
#       iwantthesefiles/baz
nothing added to commit but untracked files present (use "git add" to track)
$ ls -lhR
.:
total 8.0K
drwxr-xr-x 2 user group 4.0K 2009-12-29 14:24 idonntwantthesefiles
drwxr-xr-x 2 user group 4.0K 2009-12-29 14:24 iwantthesefiles

./idonntwantthesefiles:
total 0
-rw-r--r-- 1 user group 0 2009-12-29 14:22 bar
-rw-r--r-- 1 user group 0 2009-12-29 14:24 baz

./iwantthesefiles:
total 0
-rw-r--r-- 1 user group 0 2009-12-29 14:24 baz
-rw-r--r-- 1 user group 0 2009-12-29 14:19 foo
$ rm -r * && git reset --hard && ls -lhR
HEAD is now at 698c66a monkey
.:
total 4.0K
drwxr-xr-x 2 user group 4.0K 2009-12-29 14:25 iwantthesefiles

./iwantthesefiles:
total 0
-rw-r--r-- 1 user group 0 2009-12-29 14:25 foo

И чтобы продемонстрировать, что отслеживаемый файл переопределяет .gitignore:

$ mkdir idonntwantthesefiles
$ touch idonntwantthesefiles/baz
$
git add idonntwantthesefiles/baz
$ git commit -m 'llama'
Created commit a62b6d5: llama
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 idonntwantthesefiles/baz
$ echo foobar > idonntwantthesefiles/baz
$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   idonntwantthesefiles/baz
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .gitignore
no changes added to commit (use "git add" and/or "git commit -a")

Ответ 5

Если ни одна из вышеперечисленных работ не работает, попробуйте этот вариант внутри .gitignore

Not working for me:
!build/**/*
Working for me:
!build**/*

По какой-то причине это был единственный способ, которым он работал для меня.