2016-01-05 6 views
5

У меня есть проект php, который использует композитор для управления пакетами. Одним из пакетов является другой проект, принадлежащий к тому же репо. Мне нужно передать всю папку поставщика, но я хочу игнорировать папку .git в подпроекте, чтобы он не обрабатывался как подмодуль.Git ignore .git folder

До сих пор я не имел успеха. Вещи я уже пробовал:

продавец/.git

поставщика/**/мерзавец/

поиск Google

поиск переполнения стека


Вот что. папка подпроекта выглядит как в GitLab. Вместо файлов это просто какая-то ссылка.

enter image description here

+0

http://stackoverflow.com/questions/3240881/git-can-i-suppress-listing-of-modified-content-dirty-submodule-entries-in -sta –

+0

Это было бы здорово, если бы я не использовал какие-либо пакеты в качестве подмодулей. На самом деле именно это я и стараюсь избегать. – bluemoonballoon

+0

как насчет '' '.git''' в' '' .gitignore''' –

ответ

1

Похоже, мерзавец автоматически игнорирует .git папки в подпапках корневого хранилища.

(master)[/tmp] 
$ mkdir test_root 
(master)[/tmp] 
$ git init test_root 
Initialized empty Git repository in /tmp/test_root/.git/ 
(master)[/tmp] 
$ cd test 
test/  test_root/ 
(master)[/tmp] 
$ cd test_root/ 
(master)[/tmp/test_root] (master) 
$ ls 
(master)[/tmp/test_root] (master) 
$ git init test_child 
Initialized empty Git repository in /tmp/test_root/test_child/.git/ 
(master)[/tmp/test_root] (master) 
$ git status 
On branch master 

Initial commit 

nothing to commit (create/copy files and use "git add" to track) 
(master)[/tmp/test_root] (master) 
$ touch test_root_file 
(master)[/tmp/test_root] (master) 
$ cd test_child/ 
(master)[/tmp/test_root/test_child] (master) 
$ ls 
(master)[/tmp/test_root/test_child] (master) 
$ touch test_child_file 
(master)[/tmp/test_root/test_child] (master) 
$ cd .. 
(master)[/tmp/test_root] (master) 
$ git status 
On branch master 

Initial commit 

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

    test_child/ 
    test_root_file 

nothing added to commit but untracked files present (use "git add" to track) 
(master)[/tmp/test_root] (master) 
$ git add test_child/test_child_file 
(master)[/tmp/test_root] (master) 
$ git status 
On branch master 

Initial commit 

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

    new file: test_child/test_child_file 

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

    test_root_file 

(master)[/tmp/test_root] (master) 
$ cd test_child/ 
(master)[/tmp/test_root/test_child] (master) 
$ git status 
On branch master 

Initial commit 

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

    test_child_file 

nothing added to commit but untracked files present (use "git add" to track) 
(master)[/tmp/test_root/test_child] (master) 
$ git --version 
git version 1.9.1 
$ git add test_root_file 
(master)[/tmp/test_root] (master) 
$ git status 
On branch master 

Initial commit 

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

    new file: test_child/test_child_file 
    new file: test_root_file 

(master)[/tmp/test_root] (master) 
$ git commit -m'1 commit' 
[master (root-commit) 4d4b695] 1 commit 
2 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 test_child/test_child_file 
create mode 100644 test_root_file 
(master)[/tmp/test_root] (master) 
$ git show 
commit 4d4b69589bf4f471c3c784f95f447d2a40ee6d7d 
Author: Evgenii Shchemelev 
Date: Wed Jan 6 09:20:03 2016 +0200 

    1 commit 

diff --git a/test_child/test_child_file b/test_child/test_child_file 
new file mode 100644 
index 0000000..e69de29 
diff --git a/test_root_file b/test_root_file 
new file mode 100644 
index 0000000..e69de29 
+0

Хм. Когда я фиксирую и нажимаю как обычно, суб-проект отображается в репо в качестве ссылки, тогда как другие пакеты (из пакета) отображаются в виде файлов. Однако, если я вручную удаляю директорию .git из моего подпроекта перед фиксацией, все файлы отображаются, как и ожидалось. Может быть, есть лучший способ, чем пытаться игнорировать каталог .git? – bluemoonballoon

+1

На самом деле идея игнорирования папки git выглядит неправильно. Должен быть другой путь определенно. Я попытался совершить с условиями, которые вы описали, - все работает правильно. В фиксации ссылок нет. Может быть, ваши пакеты на самом деле являются софт-ссылками в вашей файловой системе? –

+0

@YevgeniyShchemelev попробуйте ваш тест, когда в подкаталоге '.git' размещена информация о заполненном репозитории git. – user151841

2

Для меня это выглядит как ошибка дизайна:

При загрузке второго проекта из того же хранилища, так как зависимости, этот проект должен быть перемещен в другое хранилище.

И внутри место каталога поставщика другой .gitignore файл с

# Ignore Git here 
.git 

# But not these files... 
!.gitignore 
-1

документации является вашим другом

Git Documentation сказал, что:

A leading ** followed by a slash means match in all directories. For example, **/foo matches file or directory foo anywhere, the same as pattern foo . **/foo/bar matches file or directory bar anywhere that is directly under directory "foo".

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

**/.git/ 

Я также задаюсь вопросом, почему вы собираетесь игнорировать папку, а не удалять ее.

+0

Тестирование - ваш друг. Вы пробовали это, с реальным, заполненным подкаталогом '.git'? – user151841

+0

@ user151841 См. Мой другой ответ, пожалуйста. Я считаю, что помогает –

-1

Всю папку vendor следует игнорировать, а не только подкаталоги .git. Какие пакеты используются, хранятся в composer.json и composer.lock, которые вы проверяете в контроле версий.

См: https://getcomposer.org/doc/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.md

Если вы хотите создать многоразовый пакет как часть вашего проекта, у вас есть два варианта:

A) Использование Composer для обработки еще один Repo

Добавить в composer.json. ..

{ 
    "repositories": [ 
     { 
      "url": "https://github.com/l3pp4rd/DoctrineExtensions.git", 
      "type": "git" 
     } 
    ], 
    "require": { 
     "gedmo/doctrine-extensions": "~2.3" 
    } 
} 

B) Используйте 2-й каталога с пакетами

Вы можете создать каталог packages и добавить его в своих путях автозагрузки. Это позволит использовать один Git репо для всего кода (если вы хотите использовать два репо, вы можете использовать подмодуль Git)

Добавить в composer.json ...

"autoload": { 
    "classmap": ["packages"] 
} 
+0

Уход за объяснением причины нисходящего потока? –

-1

Чтобы не лечить суб в качестве подмодуля, удалите папку .git. Чтобы вы не увидели папку с @number на веб-сайте. Если вы хотите обновить подмодуль. Вы можете создать сценарий, как следующее написано в Shell

update.sh

git clone <url> <subfolder that you won't treat it as a module> 
rm -rf <subfolder>/.git/ 
git add <subfolder> 
git commit -m "Updated module" 

update.bat

git clone <url> <subfolder> 
rmdir /s /q <subfolder>\.git 
git add <subfolder> 
git commit -m "Updated module" 

Я считаю, что это лучший способ избежать @number в GitLab

Вы можете сослаться на мой GitHub repository, созданный для ответа на этот вопрос.

0

Вы можете использовать git hooks для достижения того, чего вы хотите. Размышляя о себе, вы можете использовать pre-commit hook, чтобы переименовать каталог .git вашего проекта, например. на «.git2», добавьте все файлы в последний проект, за исключением каталога «.git2», скопируйте все, нажмите и, наконец, используйте post-commit hook, чтобы переименовать папку «.git2» обратно в «.git» в своем модуль.

1) Создание предварительной фиксации файл под .git/крюки/ вашего корня репо с содержимым:

#!/bin/sh 
mv "vendor/modulename/.git" "vendor/modulename/.git2" 

git rm --cached vendor/modulename 
git add vendor/modulename/* 
git reset vendor/modulename/.git2 

2) Создание после фиксации файл под .git/крючки/ также с содержимым:

#!/bin/sh 
mv "vendor/modulename/.git2" "vendor/modulename/.git" 

3) Чан GE файл в вашем репо и, наконец:

git commit -a -m "Commit msg" 
git push