Gibt es eine Möglichkeit, einen Verzeichnisbaum in einer Github README.md darzustellen?

79

In meiner Githubs-Repos- Dokumentation möchte ich eine Verzeichnisbaumstruktur wie diese darstellen:

Geben Sie hier die Bildbeschreibung ein

Gibt es eine Möglichkeit, dies mit Github-Markdown zu tun, außer es nur mit ASCII-Kunst zu erstellen?

Also im Grunde wie diese Frage , aber ich frage mich, ob es eine Github-spezifische Lösung gibt.

Oliver Matthews
quelle
2
Wenn Sie den Atom-Editor verwenden, können Sie mit diesem Paket einfach ASCII-Bäume schreiben: ascii-tree
Ramtin Soltani
Ich habe gerade ein Projekt für den gleichen Zweck erstellt. Es ist ein Python3-Skript. github.com/prncvrm/Project-Structure Besuchen Sie, probieren Sie es aus und machen Sie Probleme oder Gabelung.
Prinz

Antworten:

30

Nicht direkt, nein. Sie müssten es von Hand erstellen und in sich selbst stecken. Angenommen, Sie verwenden eine * nix-Box lokal und verwenden utf, dann wird sie von tree gut generiert (ich glaube, das hat das oben verwendete Beispiel generiert).

Angenommen, Sie meinen das readme.mdals Dokumentationsziel, dann wäre die einzige Möglichkeit, die Sie automatisieren könnten, ein Git-Pre-Commit-Hook, der ausgeführt treeund in Ihre Readme-Datei eingebettet wurde. Sie möchten einen Diff durchführen, um sicherzustellen, dass Sie die Readme-Datei nur aktualisiert haben, wenn sich die Ausgabe geändert hat.

Otoh wenn Sie separate Dokumente über Github Seiten pflegen, dann , was Sie können tun, ist Schalter zur Verwendung von jekyll (oder einen anderen Generator) lokal und schieben die statischen Seiten selbst. Dann können Sie die gewünschten Änderungen möglicherweise entweder als Plugin / Shell-Skript * / manuelle Änderungen implementieren (wenn sie nicht stark variieren) oder dieselbe Methode wie oben verwenden.

* Wenn Sie es in einen Commit-Hook integrieren, können Sie vermeiden, zusätzliche Schritte zum Ändern Ihrer Seiten hinzuzufügen.

Oliver Matthews
quelle
1
Danke für die Antwort, aber das habe ich nicht gemeint. Ich wollte fragen , ob es einen Weg zu repräsentieren einen Verzeichnisbaum im readme (mit Verschachtelung etc.) nicht erzeugen. Ich habe die Frage aus Gründen der Klarheit bearbeitet.
Wie in einem mit Links wie der Sortierung, die Sie in Apache erhalten würden, wenn Sie keine index.html haben?
Oliver Matthews
Nein, ich meine, wenn es eine einfache Möglichkeit gibt, so etwas zu generieren: imgur.com/OHfWdLk in Ihrer Readme- Datei .
3
Auf einem Mac können Sie den treeBefehl mit Homebrew installieren , d brew install tree. H. Dann habe ich aus dem Verzeichnis, das ich darstellen wollte, tree . >> tree.txtden Text in meiner Datei README.md ausgeführt und dann kopiert und bearbeitet. Genau das getan, was ich brauchte!
Morphatic
1
Warum wird diese Antwort akzeptiert? Hierfür stehen viele gute Dienstprogramme zur Verfügung. Bitte machen Sie dieses Handbuch nicht. Schau dir das an. github.com/michalbe/md-file-tree
nagendra547
110

Ich habe das Problem folgendermaßen gelöst:

  1. Befehl treein bash einfügen.

Beispiel

Geben Sie hier die Bildbeschreibung ein

  1. Erstellen Sie eine README.md im Github-Repository und kopieren Sie das Bash-Ergebnis
  2. In die MDD-Datei innerhalb des Markdown-Codes einfügen

Beispiel

Geben Sie hier die Bildbeschreibung ein 4. Sehen Sie die Ausgabe und seien Sie glücklich =) Geben Sie hier die Bildbeschreibung ein

Jonathas BC
quelle
1
Hier ist ein Beispiel, das Sie kopieren können. Ich habe es auf Github gefunden
Pietro Nadalini
1
Beachten Sie, dass in einigen Fällen die Verwendung von "` `` bash ... `` `" einige der Wörter hervorhebt. Stattdessen können Sie das Tag "pre" verwenden: "<pre> ... </ pre>".
Liran Funaro
37

Ich habe ein kleines Skript geschrieben, das den Trick macht:

#!/bin/bash

#File: tree-md

tree=$(tree -tf --noreport -I '*~' --charset ascii $1 |
       sed -e 's/| \+/  /g' -e 's/[|`]-\+/ */g' -e 's:\(* \)\(\(.*/\)\([^/]\+\)\):\1[\4](\2):g')

printf "# Project tree\n\n${tree}"

Beispiel:

Ursprünglicher Baumbefehl:

$ tree
.
├── dir1
│   ├── file11.ext
│   └── file12.ext
├── dir2
│   ├── file21.ext
│   ├── file22.ext
│   └── file23.ext
├── dir3
├── file_in_root.ext
└── README.md

3 directories, 7 files

Markdown-Baumbefehl:

$ ./tree-md .
# Project tree

.
 * [tree-md](./tree-md)
 * [dir2](./dir2)
   * [file21.ext](./dir2/file21.ext)
   * [file22.ext](./dir2/file22.ext)
   * [file23.ext](./dir2/file23.ext)
 * [dir1](./dir1)
   * [file11.ext](./dir1/file11.ext)
   * [file12.ext](./dir1/file12.ext)
 * [file_in_root.ext](./file_in_root.ext)
 * [README.md](./README.md)
 * [dir3](./dir3)

Gerendertes Ergebnis:

(Links sind in Stackoverflow nicht sichtbar ...)

Projektbaum
  • Baum-md
  • dir2
    • file21.ext
    • file22.ext
    • file23.ext
  • dir1
    • file11.ext
    • file12.ext
  • file_in_root.ext
  • README.md
  • dir3
Simon
quelle
Was für eine großartige Idee! Ich halte meine Minuten in Git und jetzt kann ich das README TOC einfach aktualisieren. Vielen Dank! Haben Sie daran gedacht, es konfigurierbarer zu machen?
berezovskyi
1
Schlagen Sie auch dieses nodejs-Paket von @michalbe github.com/michalbe/md-file-tree
mikequentel
Gibt es eine Möglichkeit, die Baumtiefe zu begrenzen?
Sami-L
Das hat bei Mac nicht funktioniert. !! Ich habe Brew Install Tree verwendet, um Tree zu installieren.
Nagendra547
Alter
15

Ich habe ein Knotenmodul erstellt, um diese Aufgabe zu automatisieren: mddir

Verwendung

Knoten mddir "../relative/path/"

So installieren Sie: npm install mddir -g

So generieren Sie einen Abschlag für das aktuelle Verzeichnis: mddir

So generieren Sie für einen beliebigen absoluten Pfad: mddir / absolute / path

So generieren Sie für einen relativen Pfad: mddir ~ / Documents / Whatever.

Die MD-Datei wird in Ihrem Arbeitsverzeichnis generiert.

Ignoriert derzeit die Ordner node_modules und .git.

Fehlerbehebung

Wenn Sie die Fehlermeldung 'node \ r: Keine solche Datei oder kein solches Verzeichnis' erhalten, besteht das Problem darin, dass Ihr Betriebssystem unterschiedliche Zeilenenden verwendet und mddir diese nicht analysieren kann, ohne dass Sie den Zeilenendenstil explizit auf Unix setzen. Dies betrifft normalerweise Windows, aber auch einige Linux-Versionen. Das Festlegen von Zeilenenden auf den Unix-Stil muss im globalen bin-Ordner mddir npm erfolgen.

Zeilenenden reparieren

Holen Sie sich den npm bin Ordnerpfad mit:

npm config get prefix

CD in diesen Ordner

brauen install dos2unix

dos2unix lib / node_modules / mddir / src / mddir.js

Dadurch werden Zeilenenden in Unix anstelle von Dos konvertiert

Führen Sie dann wie gewohnt aus mit: node mddir "../relative/path/".

Beispiel generierte Markdown-Dateistruktur 'directoryList.md'

    |-- .bowerrc
    |-- .jshintrc
    |-- .jshintrc2
    |-- Gruntfile.js
    |-- README.md
    |-- bower.json
    |-- karma.conf.js
    |-- package.json
    |-- app
        |-- app.js
        |-- db.js
        |-- directoryList.md
        |-- index.html
        |-- mddir.js
        |-- routing.js
        |-- server.js
        |-- _api
            |-- api.groups.js
            |-- api.posts.js
            |-- api.users.js
            |-- api.widgets.js
        |-- _components
            |-- directives
                |-- directives.module.js
                |-- vendor
                    |-- directive.draganddrop.js
            |-- helpers
                |-- helpers.module.js
                |-- proprietary
                    |-- factory.actionDispatcher.js
            |-- services
                |-- services.cardTemplates.js
                |-- services.cards.js
                |-- services.groups.js
                |-- services.posts.js
                |-- services.users.js
                |-- services.widgets.js
        |-- _mocks
            |-- mocks.groups.js
            |-- mocks.posts.js
            |-- mocks.users.js
            |-- mocks.widgets.js
John Byrne
quelle
Danke für das Knotenpaket. Ein paar Kommentare 1) gibt es eine Option, um die Ausgabe nur als Text statt als JSON zu erhalten. Ich musste die JSON-Ausgabe weiter analysieren, bevor ich sie in Markdown einfügen konnte. 2) Gibt es eine Möglichkeit, es zu erstellen, damit Sie es nicht aus dem node_modules/mddir/src/Verzeichnis ausführen müssen ? Zum Beispiel möchte ich node ~./src > dir-struct.txtaus meinem Projektverzeichnis ausführen und den Inhalt von dir-struct.txt direkt in meinen Markdown einfügen.
Wilblack
11

Der beste Weg, dies zu tun, besteht darin, Ihren Baum in den dreifachen Backticks zu umgeben, um einen Codeblock zu kennzeichnen. Weitere Informationen finden Sie in den Markdown-Dokumenten: http://daringfireball.net/projects/markdown/syntax#code

Joe Sepi
quelle
Anders als das OP gefragt hat, aber genau das Trinkgeld, das ich brauchte. Vielen Dank!
Mike Ellis
3

Sie können <pre> -Tags verwenden, wie ich es in einem meiner Projekte getan habe .

Borngeek
quelle
Wie unterscheidet sich das von dem, was das OP erwähnt hat?
Andrei Matracaru
3

Sie können dieses baumerweiterte Paket auch überprüfen . Es kann als Befehlszeilen-App verwendet werden, indem der Knoten> = 6.x verwendet wird.

Es ist sehr ähnlich, hat treeaber auch die Möglichkeit, das Maximum tief im Baum zu konfigurieren, das ist eines der schrecklichen Dinge davon. Sie können auch mithilfe einer .gitignoreDatei filtern .

Geben Sie hier die Bildbeschreibung ein

Raúl Otaño
quelle
1
Hinweis für andere: Um so etwas in Markdown umzuwandeln, fügen Sie einfach die drei Backticks hinzu.
user45254
3

Keine der oben genannten Lösungen funktionierte für mich vollständig auf meinem Mac.

Die beste Lösung, die ich gefunden habe, ist die Verwendung des hier erstellten Dienstprogramms.

https://github.com/michalbe/md-file-tree

Sobald Sie das Dienstprogramm installiert haben npm install md-file-tree -g, können Sie es einfach ausführen, um alle Dateibäume abzurufen

md-file-tree . > README.md
nagendra547
quelle
2

Hier ist eine nützliche git alias, die für mich funktioniert.

git config --global alias.tree '! git ls-tree --full-name --name-only -t -r HEAD | sed -e "s/[^-][^\/]*\//   |/g" -e "s/|\([^ ]\)/|-- \1/"'

Hier ist die Ausgabe von git tree

jonavon@XPS13:~/projects/roman-numerals$ git tree
.gitignore
pom.xml
src
   |-- main
   |   |-- java
   |   |   |-- com
   |   |   |   |-- foxguardsolutions
   |   |   |   |   |-- jonavon
   |   |   |   |   |   |-- AbstractFile.java
   |   |   |   |   |   |-- roman
   |   |   |   |   |   |   |-- Main.java
   |   |   |   |   |   |   |-- Numeral.java
   |   |   |   |   |   |   |-- RomanNumberInputFile.java
   |   |   |   |   |   |   |-- RomanNumeralToDecimalEvaluator.java
   |-- test
   |   |-- java
   |   |   |-- com
   |   |   |   |-- foxguardsolutions
   |   |   |   |   |-- jonavon
   |   |   |   |   |   |-- roman
   |   |   |   |   |   |   |-- InterpretSteps.java
   |   |   |   |   |   |   |-- RunCukesTest.java
   |   |-- resources
   |   |   |-- com
   |   |   |   |-- foxguardsolutions
   |   |   |   |   |-- jonavon
   |   |   |   |   |   |-- roman
   |   |   |   |   |   |   |-- Interpret.feature
   |   |   |-- sample-input.txt

Der vergleichbare treeBefehl

jonavon@XPS13:~/projects/roman-numerals$ tree -n
.
├── pom.xml
├── src
│   ├── main
│   │   └── java
│   │       └── com
│   │           └── foxguardsolutions
│   │               └── jonavon
│   │                   ├── AbstractFile.java
│   │                   └── roman
│   │                       ├── Main.java
│   │                       ├── Numeral.java
│   │                       ├── RomanNumberInputFile.java
│   │                       └── RomanNumeralToDecimalEvaluator.java
│   └── test
│       ├── java
│       │   └── com
│       │       └── foxguardsolutions
│       │           └── jonavon
│       │               └── roman
│       │                   ├── InterpretSteps.java
│       │                   └── RunCukesTest.java
│       └── resources
│           ├── com
│           │   └── foxguardsolutions
│           │       └── jonavon
│           │           └── roman
│           │               └── Interpret.feature
│           └── sample-input.txt
└── target
    ├── classes
    │   └── com
    │       └── foxguardsolutions
    │           └── jonavon
    │               ├── AbstractFile.class
    │               └── roman
    │                   ├── Main.class
    │                   ├── Numeral.class
    │                   ├── RomanNumberInputFile.class
    │                   └── RomanNumeralToDecimalEvaluator.class
    ├── generated-sources
    │   └── annotations
    └── maven-status
        └── maven-compiler-plugin
            └── compile
                └── default-compile
                    ├── createdFiles.lst
                    └── inputFiles.lst

30 directories, 17 files

Natürlich hat Tree eine bessere Ausgabe, aber ich möchte, dass meine .gitignore-Datei verwendet wird. Damit mein kompilierter Inhalt nicht angezeigt wird

Jonavon
quelle
1

Ein einfacher treeBefehl erledigt den Job. Beispiel: tree -o readme.mdDruckt die Baumstruktur Ihres aktuellen Arbeitsverzeichnisses und schreibt sie in readme.md. Öffnen Sie dann die Datei readme.md in einem Texteditor wie Sublime und verpacken Sie den Inhalt in ein Paar dreifacher Backticks (`` `).

Zu Ihrer Information: Möglicherweise müssen Sie den Installationsbaum in OSX brauen, wenn er nicht bereits installiert ist. Unter Linux und Windows sollte es einwandfrei funktionieren. Auch in Fenstern müssen Sie möglicherweise den Bindestrich durch einen Schrägstrich ersetzen.

Ich hoffe das hilft.

Gyan
quelle
1

Wenn Sie an Windows arbeiten, schreiben Sie tree /fin das Verzeichnis, das Sie an der Eingabeaufforderung erreichen möchten. Dies sollte Ihren Job machen. Sie können die Ausgabe bei Markdown kopieren und einfügen, umgeben von meinen dreifachen Back-Ticks, dh '' '{Baumstruktur hier}' ''

Parikshit Singh
quelle
0

Ich mag es einfach, es mit UTF-8 zu generieren und es mit jeder Datei und jedem Ordner zu verknüpfen, um wirklich einfach zu navigieren. Bitte schauen Sie sich das Beispiel hier an .

Die denerierte Markdown-Datei

Деян Добромиров
quelle
Stattdessen, wenn Sie es ablehnen. Sagen Sie mir, welche zusätzlichen Informationen Sie benötigen. Sie können einen Abschlag generieren, wie Sie möchten. Ich mache es mit meiner eigenen persönlichen Bibliothek, aber meine Präferenz kann anders sein als deine.
5еян Добромиров
0

Für diejenigen, die eine schnelle Lösung suchen:

Es gibt eine Möglichkeit, eine Ausgabe an die Konsole zu übertragen, die der Ausgabe von tree ähnelt, indem Sie den folgenden Befehl in Ihr Terminal eingeben:

ls -R YOURFOLDER | grep ':$' | sed -e 's/:$//' -e 's/[^\/]*\//|  /g' -e 's/|  \([^|]\)/|–– \1/g' 

Diese Alternative wird in dieser Dokumentation erwähnt: https://wiki.ubuntuusers.de/tree/

Anschließend kann die Ausgabe kopiert und in eine MD-Datei mit Codeblock-Back-Tics eingekapselt werden, wie in der Antwort von Jonathas BC erwähnt.

Beachten Sie jedoch, dass auch alle Knotenmodulordner in einem Knotenprojekt ausgegeben werden. Und im Baum kann man so etwas machen

tree -I node_modules

um den Ordner mit den Knotenmodulen auszuschließen.

vindom
quelle
0

Befehlsbaum in Bash einfügen.

Es gibt auch einen DOS-Befehl "Baum". Sie können Verzeichnispfade und Dateien in jedem Unterverzeichnis mit dem folgenden Befehl anzeigen:

tree /F

https://web.csulb.edu/~murdock/tree.html

BorisV
quelle