2009-12-29 3 views
12

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

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

% 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 отслеженные файлы? (В принципе, как работает подтип каталога НЕ-стиле ?! Кажется, это не так.)

Спасибо!

ответ

2

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

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

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

0

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") 
17

Возрождая старый пост, в случае, если кто-то еще натыкается на это:

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

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

+2

Для меня, мне пришлось добавить две строки:! 'Скрипты /' и 'скрипты/*' – user151841

14

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

git add -f my-ignored-folder 
Смежные вопросы