web-dev-qa-db-fra.com

Comment puis-je ajouter un répertoire vide à un référentiel Git?

Comment puis-je ajouter un répertoire vide (qui ne contient aucun fichier) à un référentiel Git?

3922
Laurie Young

Un autre moyen de créer un répertoire (presque) vide (dans le référentiel) consiste à créer un fichier .gitignore à l'intérieur de ce répertoire contenant les quatre lignes suivantes:

# Ignore everything in this directory
*
# Except this file
!.gitignore

Ensuite, vous ne devez pas obtenir l'ordre correctement comme vous devez le faire dans m104 solution .

Cela donne également l’avantage que les fichiers de ce répertoire ne seront pas affichés comme "non suivis" lorsque vous ferez un statut git.

Rendre le commentaire de @ GreenAsJade persistant:

Je pense que cela vaut la peine de noter que cette solution répond précisément à la question posée, mais n’est peut-être pas ce que beaucoup de personnes qui auront consulté cette question auront cherché. Cette solution garantit que le répertoire reste vide. Il dit "Je ne veux vraiment jamais que les fichiers soient archivés ici". Contrairement à "je n'ai pas encore de fichiers à archiver ici, mais j'ai besoin du répertoire ici, les fichiers risquent de revenir plus tard".

3811
Jamie Flournoy

Tu ne peux pas. Voir le Git FAQ .

Actuellement, la conception de l'index git (zone intermédiaire) ne permet que la liste des fichiers et aucune personne suffisamment compétente pour effectuer la modification permettant aux répertoires vides de se soucier suffisamment de cette situation pour y remédier.

Les répertoires sont ajoutés automatiquement lors de l'ajout de fichiers. C'est-à-dire que les répertoires ne doivent jamais être ajoutés au référentiel et qu'ils ne font pas l'objet d'un suivi.

Vous pouvez dire "git add <dir>" et il y ajoutera des fichiers.

Si vous avez vraiment besoin d'un répertoire pour exister dans les caisses, créez-y un fichier. .gitignore fonctionne bien à cette fin; vous pouvez le laisser vide ou indiquer le nom des fichiers que vous souhaitez afficher dans le répertoire.

1046
Andy Lester

Créez un fichier vide appelé .gitkeep dans le répertoire et ajoutez-le.

672
Artur79

Vous pouvez toujours mettre un fichier README dans le répertoire avec une explication de la raison pour laquelle vous souhaitez créer ce répertoire, sinon vide, dans le référentiel.

403
John Mee
touch .keep

Sous Linux, cela crée un fichier vide nommé .keep. Ce nom est préféré à .gitkeep car le premier est agnostique par rapport à Git, alors que le dernier est spécifique à Git. Deuxièmement, comme un autre utilisateur l’a noté, la convention de préfixe .git devrait être réservée aux fichiers et aux répertoires utilisés par Git.

Alternativement, comme indiqué dans une autre réponse , le répertoire peut contenir un descriptif README ou README.md fichier à la place.

Bien entendu, cela nécessite que la présence du fichier ne provoque pas la rupture de votre application.

304
Acumenus

Pourquoi aurions-nous besoin de dossiers versionnés vides

Tout d'abord:

Un répertoire vide ne peut pas faire partie d'un arbre sous le système de gestion de versions Git .

Cela ne sera tout simplement pas suivi. Mais il existe des scénarios dans lesquels le "versionnement" des répertoires vides peut avoir un sens, par exemple:

  • échafaudage d'une structure de dossiers prédéfinie , mise à la disposition de chaque utilisateur/contributeur du référentiel; ou, en tant que cas spécialisé de ce qui précède, créer un dossier pour fichiers temporaires , tels qu'un répertoire cache/ ou logs/ , où nous voulons fournir le dossier mais .gitignore son contenu
  • en relation avec ce qui précède, certains projets ne fonctionnera pas sans certains dossiers (ce qui est souvent le signe d’un projet mal conçu, mais c’est un scénario fréquent dans le monde réel et peut-être être, disons, des problèmes d’autorisation à résoudre).

Quelques solutions de contournement suggérées

De nombreux utilisateurs suggèrent:

  1. Placer un fichier README ou un autre fichier avec du contenu afin de rendre le répertoire non vide, ou
  2. Créer un fichier .gitignore avec une sorte de "logique inverse" (c’est-à-dire pour inclure tous les fichiers) qui, à la fin, remplit le même objectif de la démarche n ° 1.

Bien que , les deux solutions fonctionnent sûrement je les trouve incompatibles avec une approche significative de la gestion des versions Git.

  • Pourquoi êtes-vous censé mettre des fichiers ou README factices que vous ne voulez peut-être pas vraiment dans votre projet?
  • Pourquoi utiliser .gitignore pour faire quelque chose ( conservant fichiers) qui est tout le contraire de ce que cela signifie ( excluant fichiers), même si c'est possible?

approche .gitkeep

Utilisez un fichier empty appelé .gitkeep afin de forcer la présence du dossier dans le système de gestion des versions.

Bien que cela ne semble pas être une si grande différence:

  • Vous utilisez un fichier qui a pour but single de conserver le dossier. Vous n'y mettez aucune information que vous ne voulez pas mettre.

    Par exemple, vous devriez utiliser les fichiers README comme des informations utiles, pas comme une excuse pour conserver le dossier.

    La séparation des problèmes est toujours une bonne chose et vous pouvez toujours ajouter un .gitignore pour ignorer les fichiers indésirables.

  • Le nommer .gitkeep le rend très clair et direct à partir du nom de fichier lui-même (et aussi à d’autres développeurs , ce qui est bon pour un projet partagé et l’un des objectifs principaux de un référentiel Git) que ce fichier est

    • Un fichier sans rapport avec le code (en raison du point et du nom)
    • Un fichier clairement lié à Git
    • Son but ( garder ) est clairement énoncé, cohérent et sémantiquement opposé dans son sens, pour ignorer

Adoption

J'ai vu l'approche .gitkeep adoptée par des cadres très importants comme Laravel , Angular-CLI .

276
Cranio

Comme décrit dans d'autres réponses, Git est incapable de représenter des répertoires vides dans sa zone d'activation. (Voir Git FAQ .) Cependant, si, pour vos besoins, un répertoire est suffisamment vide s'il contient uniquement un fichier .gitignore, vous pouvez créer des fichiers .gitignore dans Répertoires vides uniquement via:

find . -type d -empty -exec touch {}/.gitignore \;
124
mjs

Andy Lester a raison, mais si votre répertoire doit simplement être vide, et non vide vide, vous pouvez placer un fichier .gitignore vide comme solution de contournement.

Soit dit en passant, il s’agit d’un problème de mise en œuvre, et non d’un problème fondamental de conception du stockage Git. Comme cela a été mentionné à maintes reprises sur la liste de diffusion Git, la raison pour laquelle cela n’a pas été implémenté est que personne ne s’y est soucié assez de soumettre un correctif, pas que cela ne pourrait ou ne devrait pas être fait.

65
Aristotle Pagaltzis

La manière de créer un dossier de journal Ruby on Rails :

mkdir log && touch log/.gitkeep && git add log/.gitkeep

Maintenant, le répertoire des journaux sera inclus dans l'arborescence. Il est extrêmement utile lors du déploiement, vous n’aurez donc pas à écrire de routine pour créer des répertoires de journal.

Les fichiers journaux peuvent être conservés en émettant,

echo log/dev.log >> .gitignore

mais vous le saviez probablement.

31
Thomas E

Git ne suit pas les répertoires vides. Voir le Git FAQ pour plus d'explications. La solution suggérée consiste à placer un fichier .gitignore dans le répertoire vide. Je n'aime pas cette solution car le .gitignore est "caché" par la convention Unix. De plus, il n'y a pas d'explication pour laquelle les répertoires sont vides.

Je suggère de mettre un fichier README dans le répertoire vide pour expliquer pourquoi le répertoire est vide et pourquoi il doit être suivi dans Git. Avec le fichier README en place, le répertoire n'est plus vide pour Git.

La vraie question est pourquoi avez-vous besoin du répertoire vide dans git? Habituellement, vous avez une sorte de script de construction capable de créer le répertoire vide avant la compilation/l'exécution. Sinon, faites-en un. C'est une bien meilleure solution que de mettre des répertoires vides dans git.

Vous avez donc une raison pour laquelle vous avez besoin d’un répertoire vide dans git. Mettez cette raison dans le fichier README. De cette façon, les autres développeurs (et vous-même, à l'avenir) savent pourquoi le répertoire vide doit être présent. Vous saurez également que vous pouvez supprimer le répertoire vide lorsque le problème nécessitant le répertoire vide a été résolu.


Pour lister chaque répertoire vide, utilisez la commande suivante:

find -name .git -Prune -o -type d -empty -print

Pour créer des fichiers README réservés dans chaque répertoire vide:

find -name .git -Prune -o -type d -empty -exec sh -c \
  "echo this directory needs to be empty because reasons > {}/README.emptydir" \;

Pour ignorer tout le répertoire sauf le fichier README, placez les lignes suivantes dans votre .gitignore:

path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir

Sinon, vous pouvez simplement exclure tous les fichiers README:

path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir

Pour lister tous les README après leur création:

find -name README.emptydir
28
lesmana

AVERTISSEMENT: cette modification ne fonctionne pas vraiment. Désolé pour le désagrément.

Message original ci-dessous:

J'ai trouvé une solution en jouant avec les internes de Git!

  1. Supposons que vous soyez dans votre référentiel.
  2. Créez votre répertoire vide:

    $ mkdir path/to/empty-folder
    
  3. Ajoutez-le à l'index en utilisant une commande de plomberie et l'arbre vide SHA-1 :

    $ git update-index --index-info
    040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904    path/to/empty-folder
    

    Tapez la commande puis entrez la deuxième ligne. presse Enter puis Ctrl + D mettre fin à votre saisie. Remarque: le format est mode [ESPACE] type [ESPACE] SHA-1hash [ TAB] chemin (l'onglet est important, le formatage de la réponse ne le conserve pas).

  4. C'est ça! Votre dossier vide est dans votre index. Tout ce que vous avez à faire est de vous engager.

Cette solution est courte et fonctionne apparemment bien ( voir l'EDIT! ), mais ce n'est pas si facile à retenir ...

L'arborescence vide SHA-1 peut être trouvée en créant un nouveau référentiel Git vide, cd dans celui-ci et en émettant git write-tree, qui génère l'arborescence vide SHA-1.

EDIT:

J'utilise cette solution depuis que je l'ai trouvée. Cela semble fonctionner exactement de la même manière que pour créer un sous-module, sauf qu'aucun module n'est défini nulle part. Cela entraîne des erreurs lors de l’émission de git submodule init|update. Le problème est que git update-index réécrit la partie 040000 tree en 160000 commit.

De plus, aucun fichier placé sous ce chemin ne sera jamais remarqué par Git, car il pense appartenir à un autre référentiel. C'est méchant car il peut facilement être négligé!

Cependant, si vous n'utilisez déjà (et n'utiliserez pas) de sous-modules Git dans votre référentiel, et que le dossier "vide" restera vide ou si vous souhaitez que Git connaisse son existence et ignore son contenu, vous pouvez utiliser: ce Tweak. Aller de la manière habituelle avec les sous-modules prend plus de pas que ce Tweak.

26
ofavre

Ajouter un répertoire vide semble être le chemin de moindre résistance car vous avez des scripts qui supposent que ce répertoire existe (peut-être parce qu'il s'agit d'une cible). pour les binaires générés). Une autre approche serait de modifiez vos scripts pour créer le répertoire selon vos besoins.

mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed

Dans cet exemple, vous pouvez insérer un lien symbolique (brisé) dans le répertoire afin de pouvoir y accéder sans le préfixe ".generated" (mais ceci est facultatif).

ln -sf .generated/bin bin
git add bin

Lorsque vous souhaitez nettoyer votre arbre source, vous pouvez simplement:

rm -rf .generated ## this should be in a "clean" script or in a makefile

Si vous adoptez l'approche souvent suggérée consistant à archiver un dossier presque vide, vous aurez la complexité mineure de supprimer le contenu sans supprimer également le fichier ".gitignore".

Vous pouvez ignorer tous vos fichiers générés en ajoutant ce qui suit à votre racine .gitignore:

.generated
20
nobar

Supposons qu'il vous faut un répertoire vide nommé tmp:

$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp

En d'autres termes, vous devez ajouter le fichier .gitignore à l'index avant de pouvoir dire à Git de l'ignorer (et tout le reste dans le répertoire vide).

20
m104

J'ai été confronté au problème avec les répertoires vides, aussi. Le problème avec l'utilisation de fichiers d'espaces réservés est que vous devez les créer et les supprimer s'ils ne sont plus nécessaires (car plus tard, des sous-répertoires ou des fichiers ont été ajoutés. Avec de grandes arborescences source, la gestion de ces fichiers d'espaces réservés peut être fastidieuse et erronée. enclin.

C'est pourquoi j'ai décidé d'écrire un outil open source permettant de gérer automatiquement la création/suppression de tels fichiers de substitution. Il est écrit pour la plate-forme .NET et fonctionne sous Mono (.NET pour Linux) et Windows.

Il suffit de regarder: http://code.google.com/p/markemptydirs

14
Jonny Dee

J'aime les réponses de @ Artur79 et @mjs. J'ai donc utilisé une combinaison des deux et en ai fait un standard pour nos projets.

find . -type d -empty -exec touch {}/.gitkeep \;

Cependant, seuls quelques développeurs travaillent sur Mac ou Linux. Beaucoup de travail sur Windows et je ne pouvais pas trouver un équivalent simple one-liner pour y parvenir. Certains ont eu la chance d’avoir installé Cygwin pour d’autres raisons, mais prescrire Cygwin pour cette raison semblait exagéré.

Modifier pour une meilleure solution

Donc, comme la plupart de nos développeurs ont déjà installé Ant , la première chose à laquelle j'ai pensé était de constituer un fichier de construction Ant pour le faire indépendamment de la plate-forme. Cela peut encore être trouvé ici

Cependant , j'ai pensé plus tard qu'il serait préférable d'en faire une petite commande d'utilitaire. Je l'ai donc recréé avec Python et publié. au PyPI ici . Vous pouvez l'installer en exécutant simplement:

pip3 install gitkeep2

Cela vous permettra de créer et de supprimer des fichiers .gitkeep de manière récursive, ainsi que de leur ajouter des messages pour que vos pairs puissent comprendre pourquoi ces répertoires sont importants. Ce dernier bit est un bonus. Je pensais que ce serait bien si les fichiers .gitkeep pouvaient s'auto-documenter.

$ gitkeep --help
Usage: gitkeep [OPTIONS] PATH

  Add a .gitkeep file to a directory in order to Push them into a Git repo
  even if they're empty.

  Read more about why this is necessary at: https://git.wiki.kernel.org/inde
  x.php/Git_FAQ#Can_I_add_empty_directories.3F

Options:
  -r, --recursive     Add or remove the .gitkeep files recursively for all
                      sub-directories in the specified path.
  -l, --let-go        Remove the .gitkeep files from the specified path.
  -e, --empty         Create empty .gitkeep files. This will ignore any
                      message provided
  -m, --message TEXT  A message to be included in the .gitkeep file, ideally
                      used to explain why it's important to Push the specified
                      directory to source control even if it's empty.
  -v, --verbose       Print out everything.
  --help              Show this message and exit.

J'espère que tu trouves cela utile.

12
Mig82

Vous ne pouvez pas et ne pourrez jamais, malheureusement. C'est une décision prise par Linus Torvald lui-même. Il sait ce qui est bon pour nous.

Il y a un coup de gueule quelque part que j'ai lu une fois.

J'ai trouvé Re: répertoires vides .., mais peut-être il y en a un autre.

Vous devez vivre avec les solutions de contournement ... malheureusement.

12
user2334883

Lorsque vous ajoutez un fichier .gitignore, si vous voulez y mettre une quantité de contenu (que vous voulez que Git ignore), vous pouvez ajouter une seule ligne avec juste un astérisque * pour créer Assurez-vous de ne pas ajouter accidentellement le contenu ignoré.

10
Michael Johnson

La solution de Jamie Flournoy fonctionne très bien. Voici une version un peu améliorée pour garder le .htaccess:

# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess

Avec cette solution, vous pouvez valider un dossier vide, par exemple /log, /tmp ou /cache et le dossier restera vide.

8
Roman

Comme mentionné, il n'est pas possible d'ajouter des répertoires vides, mais voici une ligne qui ajoute des fichiers .gitignore vides à tous les répertoires.

Ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'

J'ai collé ceci dans un Rakefile pour un accès facile.

8
Peter Hoeg

Voici un hack, mais c'est marrant que ça marche (Git 2.2.1). Semblable à ce que @Teka a suggéré, mais plus facile à retenir:

  • Ajouter un sous-module à n'importe quel référentiel (git submodule add path_to_repo)
  • Cela ajoutera un dossier et un fichier .submodules. Commettre un changement.
  • Supprimez le fichier .submodules et validez la modification.

Vous avez maintenant un répertoire créé lorsque la validation est extraite. Une chose intéressante est que si vous regardez le contenu de l'objet tree de ce fichier, vous obtiendrez:

fatal: le nom de l'objet n'est pas valide

Je n'encouragerais cependant pas à l'utiliser car cela pourrait cesser de fonctionner dans les futures versions de Git. Ce qui peut laisser votre référentiel corrompu.

7

Il n’existe aucun moyen de faire en sorte que Git assure le suivi des répertoires. La seule solution consiste donc à ajouter un fichier d’espace réservé dans le répertoire que Git doit suivre.

Le fichier peut être nommé et contenir tout ce que vous voulez, mais la plupart des gens utilisent un fichier vide nommé .gitkeep (bien que certaines personnes préfèrent le _ (VCS-agnostic .keep).

Le préfixe . le marque comme un fichier caché.

Une autre idée serait d’ajouter un fichier README expliquant l’utilisation du répertoire.

7
Zaz

Je crée toujours une fonction pour vérifier la structure de dossiers souhaitée et la construire pour moi dans le projet. Cela résout ce problème car les dossiers vides sont conservés dans Git par proxy.

function check_page_custom_folder_structure () {
    if (!is_dir(TEMPLATEPATH."/page-customs"))
        mkdir(TEMPLATEPATH."/page-customs");    
    if (!is_dir(TEMPLATEPATH."/page-customs/css"))
        mkdir(TEMPLATEPATH."/page-customs/css");
    if (!is_dir(TEMPLATEPATH."/page-customs/js"))
        mkdir(TEMPLATEPATH."/page-customs/js");
}

Ceci est en PHP, mais je suis sûr que la plupart des langues supportent les mêmes fonctionnalités, et comme la création des dossiers est prise en charge par l'application, les dossiers seront toujours présents.

7
Mild Fuzz

Si vous voulez ajouter un dossier qui contiendra beaucoup de données transitoires dans plusieurs répertoires sémantiques, une approche consiste à ajouter quelque chose comme ceci à votre racine .gitignore ...

/app/data/**/*.* !/app/data/**/*.md

Ensuite, vous pouvez valider des fichiers README.md descriptifs (ou des fichiers vierges, peu importe, dans la mesure où vous pouvez les cibler de manière unique, comme avec *.md dans ce cas) dans chaque répertoire pour vous assurer que tous les répertoires restent partie du repo mais les fichiers (avec les extensions) sont conservés ignorés. LIMITATION: . 'ne sont pas autorisés dans les noms de répertoire!

Vous pouvez remplir tous ces répertoires avec des fichiers xml/images ou autre et ajouter d'autres répertoires sous /app/data/ au fil du temps, à mesure que le stockage de votre application évoluera (avec les fichiers README.md servant à graver une description de ce que vous voulez. chaque répertoire de stockage est pour exactement).

Il n'est pas nécessaire de modifier davantage votre .gitignore ou de le décentraliser en créant un nouveau .gitignore pour chaque nouveau répertoire. Ce n’est probablement pas la solution la plus intelligente, mais plutôt concise, elle fonctionne toujours pour moi. Sympa et simple! ;)

enter image description here

5
ajmedway

Tu ne peux pas. Ceci est une décision de conception intentionnelle prise par les responsables de Git. Fondamentalement, le but d’un système de gestion de code source comme Git est de gérer le code source et les répertoires vides ne sont pas du code source. Git est aussi souvent décrit comme un suivi de contenu, et encore une fois, les répertoires vides ne sont pas des contenus (bien au contraire, en fait), ils ne sont donc pas suivis.

5
Jörg W Mittag

Ajout d'une option supplémentaire à la mêlée.

En supposant que vous souhaitiez ajouter un répertoire à git qui, pour toutes les raisons liées à git, doit rester vide et que son contenu ne soit jamais suivi, un .gitignore comme suggéré à maintes reprises, faire l'affaire.

Le format, comme mentionné, est:

*
!.gitignore

Maintenant, si vous voulez un moyen de faire cela en ligne de commande, en un seul coup, alors que à l'intérieur le répertoire que vous voulez ajouter, vous pouvez exécuter:

$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore

Moi-même, j'ai un script Shell que j'utilise pour faire cela. Nommez le script comme vous le souhaitez et ajoutez-le quelque part dans votre chemin d'inclusion ou faites-le directement référence:

#!/bin/bash

dir=''

if [ "$1" != "" ]; then
    dir="$1/"
fi

echo "*" > $dir.gitignore && \
echo '!.gitignore' >> $dir.gitignore && \
git add $dir.gitignore

Avec cela, vous pouvez soit l'exécuter à partir du répertoire que vous souhaitez ajouter, soit référencer le répertoire en tant que premier et unique paramètre:

$ ignore_dir ./some/directory

Une autre option (en réponse à un commentaire de @GreenAsJade), si vous souhaitez suivre un dossier vide qui MAY contient des fichiers suivis à l'avenir, mais restera vide pour l'instant, vous pouvez omettre la * à partir du fichier .gitignore et vérifiez that in. En gros, tout le fichier dit est "n'ignore pas moi", mais sinon , le répertoire est vide et suivi.

Votre fichier .gitignore ressemblerait à ceci:

!.gitignore

Voilà, vérifiez-le, et vous avez un répertoire vide, mais non suivi, dans lequel vous pourrez suivre les fichiers ultérieurement.

La raison pour laquelle je suggère de garder cette ligne dans le fichier est qu’elle donne le but .gitignore. Sinon, certains pourraient penser à l'enlever. Cela peut aider si vous placez un commentaire au-dessus de la ligne.

4
Mike

Parfois, vous devez gérer des bibliothèques ou des logiciels mal écrits, qui nécessitent un "vrai" répertoire vide et existant. Mettre un simple .gitignore ou .keep pourrait les casser et causer un bogue. Ce qui suit pourrait aider dans ces cas, mais aucune garantie ...

Commencez par créer le répertoire nécessaire:

mkdir empty

Ensuite, vous ajoutez un lien symbolique brisé à ce répertoire (mais dans tous les cas autres que le cas d'utilisation décrit ci-dessus, veuillez utiliser un README avec une explication):

ln -s .this.directory empty/.keep

Pour ignorer les fichiers de ce répertoire, vous pouvez les ajouter à la racine .gitignore:

echo "/empty" >> .gitignore

Pour ajouter le fichier ignoré, utilisez un paramètre pour le forcer:

git add -f empty/.keep

Après la validation, vous avez un lien symbolique cassé dans votre index et git crée le répertoire. Le lien brisé présente certains avantages, car il ne s'agit pas d'un fichier normal et ne pointe vers aucun fichier normal. Donc, cela correspond même à la partie de la question "(qui ne contient aucun fichier)", non pas par l'intention mais par le sens, je suppose:

find empty -type f

Cette commande affiche un résultat vide, car aucun fichier n'est présent dans ce répertoire. Ainsi, la plupart des applications, qui obtiennent tous les fichiers d'un répertoire, ne voient généralement pas ce lien, du moins si un fichier "existe" ou un fichier "est lisible". Même certains scripts n'y trouveront aucun fichier:

$ php -r "var_export(glob('empty/.*'));"
array (
  0 => 'empty/.',
  1 => 'empty/..',
)

Mais je recommande fortement d’utiliser cette solution uniquement dans des circonstances spéciales, un bon README écrit dans un répertoire vide est généralement une meilleure solution. (Et je ne sais pas si cela fonctionne avec un système de fichiers Windows ...)

4
Trendfischer

Pour ce faire, ajoutez un fichier .gitkeep au répertoire que vous souhaitez conserver (actuellement) vide.

Voir ceci réponse SOF pour plus d'informations - ce qui explique également pourquoi certaines personnes trouvent la convention en concurrence d'ajouter un fichier .gitignore (comme indiqué dans de nombreuses réponses ici) déroutante.

3
arcseldon

Parfois, j'ai des référentiels avec des dossiers qui ne contiendront jamais que des fichiers considérés comme du "contenu" - en d'autres termes, ce ne sont pas des fichiers que je tiens à être versionnés, et ne doivent donc jamais être validés. Avec le fichier .gitignore de Git, vous pouvez ignorer des répertoires entiers. Mais il est parfois utile d’avoir le dossier dans le dépôt. Voici une excellente solution pour répondre à ce besoin.

Ce que j'ai fait par le passé est de placer un fichier .gitignore à la racine de mon référentiel, puis d'exclure le dossier, comme suit:

/app/some-folder-to-exclude
/another-folder-to-exclude/*

Cependant, ces dossiers ne font alors pas partie du repo. Vous pouvez ajouter quelque chose comme un fichier README. Mais vous devez ensuite dire à votre application de ne pas s’inquiéter du traitement des fichiers README.

Si votre application dépend des dossiers présents (bien que vides), vous pouvez simplement ajouter un fichier .gitignore au dossier en question et l'utiliser pour atteindre deux objectifs:

Dites à Git qu'il y a un fichier dans le dossier, ce qui oblige Git à l'ajouter au référentiel. Dites à Git d'ignorer le contenu de ce dossier, moins ce fichier lui-même. Voici le fichier .gitignore à mettre dans vos répertoires vides:

*
!.gitignore

La première ligne (*) indique à Git d’ignorer tout ce qui se trouve dans ce répertoire. La deuxième ligne indique à Git de ne pas ignorer le fichier .gitignore. Vous pouvez insérer ce fichier dans tous les dossiers vides que vous souhaitez ajouter au référentiel.

2
Rahul Sinha

Vous pouvez enregistrer ce code sous le nom create_readme.php et exécuter le code PHP à partir du répertoire racine de votre projet Git.

> php create_readme.php

Il ajoutera les fichiers README à tous les répertoires vides afin que ces répertoires soient ensuite ajoutés à l'index.

<?php
    $path = realpath('.');
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path),       RecursiveIteratorIterator::SELF_FIRST);
    foreach($objects as $name => $object){
        if ( is_dir($name) && ! is_empty_folder($name) ){
            echo "$name\n" ;
            exec("touch ".$name."/"."README");
        }
    }

    function is_empty_folder($folder) {
        $files = opendir($folder);
        while ($file = readdir($files)) {
            if ($file != '.' && $file != '..')
                return true; // Not empty
            }
        }
?>

Alors fais

git commit -m "message"
git Push
2
user665190

Beaucoup ont déjà répondu à cette question. Il suffit d'ajouter une version de PowerShell ici.

Trouver tous les dossiers vides dans le répertoire

Ajoutez un fichier .gitkeep vide

Get-ChildItem 'Path to your Folder' -Recurse -Directory | Where-Object {[System.IO.Directory]::GetFileSystemEntries($_.FullName).Count -eq 0} | ForEach-Object { New-Item ($_.FullName + "\.gitkeep") -ItemType file}
0
Hainan.Z