2016-01-05 23 views
5

Ich habe ein PHP-Projekt, das Composer für die Paketverwaltung verwendet. Eines der Pakete ist ein anderes Projekt, das zu demselben Repo gehört. Ich muss meinen gesamten Lieferantenordner festschreiben, aber ich möchte den .git-Ordner im Unterprojekt ignorieren, damit er nicht wie ein Submodul behandelt wird.Git ignorieren .git Ordner

Bis jetzt hatte ich keinen Erfolg. Dinge, die ich habe schon versucht:

Verkäufer/.git

Verkäufer/**/git/

Google-Suche

Stapelüberlauf Suche


Hier ist, was die. Der Unterprojektordner sieht aus wie in GitLab. Anstatt der Dateien ist es nur eine Art Referenz.

enter image description here

+0

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

+0

Das wäre großartig, außer dass ich keines der Pakete als Submodule benutze. Genau das versuche ich gerade zu vermeiden. – bluemoonballoon

+0

Wie wäre es nur mit '' '.git''' in' '' .gitignore''' –

Antwort

1

Es sieht aus wie automatisch git .git Ordner in Unterordner der Root-Repository ignoriert.

(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

Hmm. Wenn ich wie üblich commit und push mache, wird das Unterprojekt im Repo als Referenz angezeigt, während andere Pakete (von packagist) als Dateien angezeigt werden. Wenn ich jedoch das .git-Verzeichnis manuell aus meinem Unterprojekt lösche, werden alle Dateien wie erwartet angezeigt. Vielleicht gibt es einen besseren Weg, als zu versuchen, das .git dir zu ignorieren? – bluemoonballoon

+1

Eigentlich scheint die Idee, den Ordner git zu ignorieren, falsch. Sollte anders sein auf jeden Fall. Ich habe versucht, mit den von Ihnen beschriebenen Bedingungen zu handeln - alles funktioniert richtig. Es gibt keine Referenzen beim Commit. Sind Ihre Pakete tatsächlich weiche Links in Ihrem Dateisystem? –

+0

@YevgeniyShchemelev versuchen Sie Ihren Test, wenn das Unterverzeichnis '.git' Informationen für ein bevölkertes Git Repo enthält. – user151841

2

Für mich sieht aus wie ein Design-Fehler:

Wenn Sie ein zweites Projekt aus demselben Repository als Abhängigkeit laden, sollte dieses Projekt in ein anderes Repository verschoben werden.

Und innerhalb der Verkäufer Verzeichnis eine andere .gitignore Datei mit

# Ignore Git here 
.git 

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

Dokumentation ist dein Freund

Git Documentation sagte, dass:

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".

So können Sie den folgenden Code versuchen zu ignorieren .git Ordner in Unterverzeichnissen:

Ich frage mich auch, warum Sie den Ordner ignorieren, anstatt es zu löschen.

+0

Testen ist dein Freund. Hast du das mit einem echten, bevölkerten '.git'-Unterverzeichnis versucht? – user151841

+0

@ user151841 Siehe meine andere Antwort bitte. Ich glaube, dass hilft –

-1

Der gesamte Ordner vendor sollte ignoriert werden, nicht nur die Unterverzeichnisse .git. Welche Pakete verwendet werden, ist in composer.json und composer.lock gespeichert, die Sie in die Versionskontrolle einchecken.

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

Wenn Sie ein wiederverwendbares Paket als Teil des Projekts zu erstellen, haben Sie zwei Möglichkeiten:

A) Komponist Verwenden Sie einen anderen

Repo

-composer.json hinzufügen zu handhaben. ..

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

B) verwenden, um ein zweites Verzeichnis Pakete

Sie ein packages Verzeichnis erstellen und fügen Sie sie automatisch geladen Pfade. Auf diese Weise können Sie einen einzelnen Git Repo für den gesamten Code verwenden (wenn Sie zwei repos verwenden möchten, können Sie ein Git-Modul verwenden)

-composer.json Hinzufügen ...

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

Care, um den Grund für den Downvote zu erklären? –

-1

nicht sub behandeln Ordner als Submodul, löschen Sie den Ordner .git. Damit Sie keinen Ordner mit @number in der Website sehen. Wenn Sie das Submodul aktualisieren wollen. Sie können ein Skript wie das in 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" 

Ich glaube folgendes geschrieben schaffen dies der beste Weg ist, zu vermeiden @number in Gitlab

Sie können meine GitHub repository für die Beantwortung dieser Frage erstellt beziehen.

0

Sie können Git Haken verwenden, um zu erreichen, was Sie wollen. Denken Sie out of the Box, könnten Sie vor-commit Hook verwenden, um das .git Verzeichnis Ihres eingeschlossenen Projekts umzubenennen, z. zu ".git2", fügen Sie alle Dateien im letzteren Projekt mit Ausnahme des Verzeichnisses ".git2" hinzu, übernehmen Sie alle, drücken Sie es und verwenden Sie schließlich post-commit hook, um den Ordner ".git2" in ".git" umzubenennen Modul.

1) Erstellen pre-commit Datei unter .git/Haken/ Ihrer Wurzel Repo mit Inhalt:

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

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

2) Erstellen post-commit Datei unter .git/Haken/ auch mit Inhalt:

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

3) Chan ge eine Datei in Ihrem Repo und schließlich:

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