Ist es möglich, einem Repo einen Unterordner mit einem .git-Ordner hinzuzufügen, ohne dass Git ihn wie ein Submodul behandelt? Ich habe verschiedene Methoden ausprobiert, um diesen .git-Ordner zu ignorieren, aber bisher hat nichts funktioniert.
Ich habe in /.gitignore versucht:
/vendor/**/.git/
..und in /vendor/.gitignore:
.git/
Der .git-Ordner, den ich ignorieren möchte, befindet sich in /vendor/foo/bar/.
.git/ wird von git automatisch ignoriert
– Vinay Prajapati
9. März 2018 um 21:45 Uhr
Können Sie klarstellen, was Sie wollen? Sind Sie sicher, dass Ihr Git-GUI-Client nicht fälschlicherweise einen Unterordner mit a behandelt? .git Verzeichnis als Untermodul? Welchen Git-Client verwendest du?
– Gregory Pakosz
10. März 2018 um 17:56 Uhr
Zwölf Google-Suchanfragen später liefert Vinay Prajapati die gesuchte Antwort in den Kommentaren.
– Matt Lemmon
6. November 2021 um 10:35 Uhr
Sie können dies tun, indem Sie zuerst einige (beliebige) interne Inhalte direkt hinzufügen. Git erkennt Submodule, indem es auf die trifft .git -Eintrag beim Durchsuchen eines neu gefundenen Verzeichnisses, aber wenn Sie ihm einen tatsächlichen Pfad angeben, nach dem in diesem Verzeichnis gesucht werden soll, wird nicht gesucht.
So
git add path/to/some/submodule/file # bypass initial search that detects .git
git add path/to/some/submodule # now git's index has it as ordinary dir
Jannes Botis
Sie können verwenden Git-Haken um zu erreichen, was Sie wollen. Wenn Sie über den Tellerrand hinaus denken, könnten Sie eine erstellen vorab verpflichten Haken, der die umbenennt .git Verzeichnis Ihres inkludierten Projekts, zB. zu “.git2”, fügen Sie alle Dateien im letzteren Projekt außer dem “.git2”-Verzeichnis hinzu, übertragen Sie alle, pushen Sie sie und verwenden Sie sie schließlich Post-Commit-Hook um den Ordner “.git2” in Ihrem Modul wieder in “.git” umzubenennen.
1) Erstellen vorab verpflichten Datei unter .git/hooks/ von dir Wurzel Repo mit Inhalt:
3) Ändern Sie eine Datei in Ihrem Repo und schließlich:
git commit -a -m "Commit msg"
git push
Meine ursprüngliche Antwort
Danke dafür. Es inspirierte eine Husky-basierte Lösung.
– Xunnamius
25. Februar um 18:58 Uhr
Deine Frage hat mich interessiert, also habe ich es versucht:
$ cd /tmp
$ git init foo
Initialized empty Git repository in /private/tmp/foo/.git/
$ cd foo
$ git init bar
Initialized empty Git repository in /private/tmp/foo/bar/.git/
$ cd bar
$ echo "this is bar" > bar.txt
$ git add bar.txt
$ git commit -m "initial commit"
[master (root-commit) c9d6507] initial commit
1 file changed, 1 insertion(+)
create mode 100644 bar.txt
$ cd ..
$ pwd
/tmp/foo
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
bar/
nothing added to commit but untracked files present (use "git add" to track)
$ git add bar
$ git commit -m "parent initial commit"
[master (root-commit) b23e106] parent initial commit
1 file changed, 1 insertion(+)
create mode 100644 bar/bar.txt
$ echo "baz" > bar/.git/baz.txt
$ git status
On branch master
nothing to commit, working tree clean
Zu deiner Frage, /tmp/foo ist ein Git-Repository. Und in Bezug auf /tmp/foo, /tmp/foo/bar ist ein Unterverzeichnis, das selbst eine hat .git Verzeichnis.
Wie Sie sehen können, die Eltern foo Repository ignoriert die vollständig bar/.git Unterverzeichnis und ich brauchte nicht einmal eine .gitignore Datei.
Und auf keinen Fall behandelt Git einen Pfad, der a enthält .git Ordner als Submodul, ohne es im .gitmodules Datei.
Ich hätte es kommentieren können, aber ich hätte nicht näher auf die genauen Schritte eingehen können, die ich verwendet habe, um zu meiner Schlussfolgerung zu gelangen. Also hier ist es als Antwort
– Gregory Pakosz
9. März 2018 um 21:47 Uhr
Ihr Transkript entspricht weder meinen Erwartungen noch den Git-Dokumenten, und ich kann es selbst nicht reproduzieren. Auf welcher Git-Version läuft das? Ich habe bisher 2.16 und 2.12 und 2.10 ausprobiert.
– jthill
10. März 2018 um 22:03 Uhr
git version 2.16.2 auf MacOS
– Gregory Pakosz
11. März 2018 um 8:35 Uhr
Ich kann es mit reproduzieren 2.16.2 auf Linux
– Gregory Pakosz
11. März 2018 um 9:20 Uhr
Während es wahr ist .git automatisch ignoriert wird, wird das Hauptrepo behandelt /vendor/foo/bar als Gitlink (spezieller Eintrag im Haupt-Repo-Index) und nicht als reguläre Dateien.
Ein Trick wäre einfach zu Bewegungbar/.gitaußen das Hauptrepo:
vendor/foo/bar als normaler Unterordner behandelt, der bei Bedarf zum Hauptrepo hinzugefügt werden kann.
Das Bar Repo kann jederzeit Änderungen erkennen und Commit vornehmen, wenn Sie Ihre vorangegangen sind git Befehl mit GIT_DIR=/path/to/bar/.git git ...
Zum Beispiel:
cd /path/to/main/repo/vendor/foo/bar
GIT_DIR=/path/to/bar/.git git status
GIT_DIR=/path/to/bar/.git git add .
GIT_DIR=/path/to/bar/.git git commit -m "changes to bar"
GIT_DIR=/path/to/bar/.git git push
Aufrichtiger Mond _Max_
Wie in jthill answer können Sie jedes Element aus dem Unterverzeichnis mit hinzufügen .git und es wird als Unterverzeichnis statt als Untermodul behandelt.
Aber wenn Sie dieses Unterverzeichnis bereits als Untermodul registriert haben, hat das .git Sie müssen dieses Untermodul zuerst entfernen, aber in Ihrem Arbeitsbaum belassen – git rm --cached a/submodule.
Mehr Infos auf: Wie entferne ich ein Submodul?
Dann können Sie die Schritte von jthill answer wiederholen.
Aus meiner Forschung gibt es keine Möglichkeit, mit der Behandlung aufzuhören .git Ordner als Untermodul. Die beste Lösung, die mir jetzt einfällt, ist zu haben bash oder ein ähnliches Skript, das Sie in jedem Ordner in der Konsole ausführen können. Es sollte alle Unterordner finden, die haben .git und versuchen Sie, eine beliebige Datei aus diesem Ordner zum Hauptordner hinzuzufügen .gitalso würde es aufhören, sie als Untermodule zu behandeln.
#!/bin/bash
# Get a list of all the submodules
submodules=($(git config --file .gitmodules --get-regexp path | awk '{ print $2 }'))
# Loop over submodules and convert to regular files
for submodule in "${submodules[@]}"
do
echo "Removing $submodule"
git rm --cached $submodule # Delete references to submodule HEAD
rm -rf $submodule/.git* # Remove submodule .git references to prevent confusion from main repo
git add $submodule # Add the left over files from the submodule to the main repo
git commit -m "Converting submodule $submodule to regular files" # Commit the new regular files!
done
# Finally remove the submodule mapping
git rm.gitmodules
Denken Sie daran, Änderungen immer festzuschreiben/zu sichern, bevor Sie neue Skripte ausprobieren, um Arbeits-/Datenverluste zu vermeiden.
Klaatu von Schlacker
Sie können dafür Git-Ausschlüsse verwenden.
Erstellen Sie zunächst eine .gitexclude-Datei:
$ echo "vendor/*/.git" >> .gitexclude
Fügen Sie dann diese Datei als Quelle für Ausschlüsse zu Ihrer Git-Konfiguration hinzu:
$ git config core.excludesFile .gitexclude
Jetzt können Sie Dateien hinzufügen und Git bietet nicht an, sie als Submodule hinzuzufügen:
$ git add vendor
$
Sie können überprüfen, ob eine Datei tatsächlich für Git “unsichtbar” ist git check-ignore:
.git/ wird von git automatisch ignoriert
– Vinay Prajapati
9. März 2018 um 21:45 Uhr
Können Sie klarstellen, was Sie wollen? Sind Sie sicher, dass Ihr Git-GUI-Client nicht fälschlicherweise einen Unterordner mit a behandelt?
.git
Verzeichnis als Untermodul? Welchen Git-Client verwendest du?– Gregory Pakosz
10. März 2018 um 17:56 Uhr
Zwölf Google-Suchanfragen später liefert Vinay Prajapati die gesuchte Antwort in den Kommentaren.
– Matt Lemmon
6. November 2021 um 10:35 Uhr