.git-Ordner im Unterordner ignorieren

Lesezeit: 6 Minuten

Benutzeravatar von Znarkus
Znarkus

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

Benutzeravatar von Jannes Botis
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:

#!/bin/sh
mv "vendor/foo/bar/.git" "vendor/foo/bar/.git2"

git rm --cached vendor/foo/bar
git add vendor/foo/bar/*
git reset vendor/foo/bar/.git2

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

#!/bin/sh
mv "vendor/foo/bar/.git2" "vendor/foo/bar/.git"

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 Bewegung bar/.git auß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

Benutzeravatar von Candid Moon _Max_
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.

Quellcode unten: Bash-Skript zum automatischen Konvertieren von Git-Submodulen in reguläre Dateien

#!/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.

Benutzeravatar von Klaatu von Schlacker
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 check-ignore vendor/foo/.git
vendor/foo/.git
$ git check-ignore vendor/foo/bar.txt
$

Referenz: man git-add(1) man git-check-ignore(1)

Benutzeravatar von Hidden
Versteckt

Hast du es schon mal mit Wildcards versucht?

**/vendor/.git/

1429410cookie-check.git-Ordner im Unterordner ignorieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy