J'ai une idée inhabituelle d'utiliser git comme système de sauvegarde. Alors disons que j'ai un répertoire ./backup/myfiles et je veux le sauvegarder en utilisant git. Pour garder les choses propres, je ne veux pas avoir de répertoire .git dans le dossier myfiles, alors j'ai pensé que je pourrais créer ./backup/git_repos/myfiles. En regardant la documentation git, j'ai essayé de faire ceci:
$ cd backup/myfiles
$ mkdir ../git_repos/myfiles
$ git --git-dir=../git_repos/myfiles init
Initialized empty Git repository in backup/git_repos/myfiles/
$ git --git-dir="../git_repos/myfiles/" add foo
fatal: pathspec 'foo' did not match any files
Vous pouvez voir le message d'erreur J'y arrive. Qu'est-ce que je fais mal?
Réponses:
Cela fera ce que vous voulez mais sera évidemment nul lorsque vous devrez le spécifier avec chaque commande git que vous utiliserez.
Vous pouvez exporter
GIT_WORK_TREE=.
etGIT_DIR=../backup
Git les récupérera à chaque commande. Cela ne vous permettra cependant que de travailler confortablement dans un seul référentiel par shell.Je suggère plutôt de créer un lien symbolique vers le répertoire .git ailleurs ou de créer un lien symbolique vers le répertoire .git à partir de votre répertoire de sauvegarde principal.
la source
Il vous suffit de vous assurer que le référentiel sait où se trouve l'arbre de travail et vice versa.
Pour indiquer au référentiel où se trouve l'arborescence de travail, définissez la valeur de configuration
core.worktree
. Pour que l'arborescence de travail sache où se trouve le répertoire git, ajoutez un fichier nommé .git (pas un dossier!) Et ajoutez une ligne commeDepuis git 1.7.5, la commande init a appris une option supplémentaire pour cela.
Vous pouvez initialiser un nouveau référentiel séparé avec
Cela initialisera le référentiel git dans le répertoire séparé et ajoutera le fichier .git dans le répertoire actuel, qui est le répertoire de travail du nouveau référentiel.
Avant la version 1.7.5, vous deviez utiliser des paramètres légèrement différents et ajouter vous-même le fichier .git.
Pour initialiser un référentiel distinct, la commande suivante relie l'arborescence de travail au référentiel:
Votre répertoire actuel sera l'arborescence de travail et git utilisera le référentiel à
/path/to/repo.git
. La commande init définira automatiquement lacore.worktree
valeur spécifiée avec le--git-dir
paramètre.Vous pouvez même ajouter un alias pour cela:
Utiliser le contrôle de version git sur un répertoire de travail en lecture seule
Avec les connaissances ci-dessus, vous pouvez même configurer le contrôle de version git pour un répertoire de travail sans avoir les autorisations d'écriture. Si vous utilisez
--git-dir
sur chaque commande git ou exécutez chaque commande à partir du référentiel (au lieu du répertoire de travail), vous pouvez omettre le fichier .git et n'avez donc pas besoin de créer de fichiers dans le répertoire de travail. Voir aussi la réponse des Léosla source
core.worktree
est bien entendu stockée dans le fichier de configuration du dossier .git, vers lequel pointe le fichier .git.fatal: core.worktree and core.bare do not make sense
. On dirait que changer la configuration pour que ce ne soit pas nu résout cela.L'
--separate-git-dir
option pourgit init
(etgit clone
) peut être utilisée pour accomplir cela sur ma version de git (1.7.11.3
). L'option sépare le référentiel git de l'arborescence de travail et crée un lien symbolique git indépendant du système de fichiers (sous la forme d'un fichier nommé.git
) à la racine de l'arborescence de travail. Je pense que le résultat est identique à la réponse de Niks .la source
init
elle-même semble plus claire et plus proprerepo.git
est créé avec son jeu d'attributs caché. Je le change ensuite manuellement. Savez-vous si c'est sûr?Je trouve plus simple d'inverser les répertoires
--work-tree
et--git-dir
utilisés dans la réponse de niks:Cette approche a deux avantages:
.git
fichiers. Vous opérez simplement normalement à partir de la racine du référentiel.La seule mise en garde que j'ai rencontrée est qu'au lieu d'utiliser un
.gitignore
fichier, vous modifiezinfo/exclude
.Vous pouvez ensuite utiliser le référentiel
read_only_repos/foo
comme distant dans vos propres référentiels même si les fichiers d'origine ne sont pas sous contrôle de version.la source
Il est conventionnel de nommer un répertoire qui est un dépôt git qui a son arbre de travail dans un endroit inhabituel avec une extension '.git', un peu comme un dépôt nu.
Si vous aviez fourni l'
--work-tree
option au moment de l'initialisation, cela aurait automatiquement configuré lacore.worktree
variable de configuration, ce qui signifie que git saura où trouver l'arborescence de travail une fois que vous aurez spécifié le répertoire git.Mais vous pouvez également définir cette variable après coup.
Une fois que vous avez fait cela, la commande add devrait fonctionner comme prévu.
la source
Utiliser
git
à l'intérieur du repo:À partir de maintenant, vous pouvez utiliser
git
à l'intérieur du./backup/git_repos/myfiles
répertoire, sans définir de variables d'environnement ni de paramètres supplémentaires.la source
warning: core.bare and core.worktree do not make sense
Cela signifie-t-il que cela n'a pas fonctionné?core.bare
à lafalse
suite.Vous pouvez créer un script "nodgit" (No Dot GIT) avec quelque chose comme
Vous pouvez appeler nodgit à la place de git et il définira des variables si nécessaire en recherchant un dépôt git. Par exemple, disons que vous avez un dépôt (nu) dans / usr / local / gits / __ home__foo_wibbles et que vous êtes dans / home / foo / wibbles / one alors il trouvera le bon répertoire de travail (/ home / foo / wibbles) et le repo .
Oh, vous pouvez également utiliser "nodgit shell" pour obtenir un shell avec le bon jeu de variables afin que vous puissiez utiliser les anciennes commandes git.
la source
En supposant que vos
myfiles
répertoires existent déjà et contiennent du contenu, pourriez-vous vivre avec ceci:Le
.git
répertoire sera dansbackup
, pas dansmyfiles
.la source
git
suivre à l'aide du.gitignore
fichier. Si vous ajoutez*
et!myfiles
à lui, seul ce répertoire sera suivi. Mais si vous voulez un dépôt séparé pour un autre répertoire, vous auriez un problème ...Je crée des scripts qui ressemblent à
~ / bin / git-slash:
Il est redondant d'utiliser --git_dir = $ GIT_DIR, mais cela me rappelle que je peux également définir des variables d'environnement en dehors du script.
L'exemple ci-dessus sert à suivre les modifications locales des fichiers système cygwin.
Je peux créer un tel script pour tout projet majeur qui en a besoin - mais / sans /.git est mon utilisation principale.
Ce qui précède est suffisamment petit pour créer un alias ou une fonction de shell, si vous éliminez la redondance.
Si je fais cela assez souvent, je raviverais l'espace de travail au mappage de référentiel de
dont l'homologue moderne le plus proche est les mappages ou vues Perforce , prenant en charge les extractions partielles ainsi que la non-colocation de l'espace de travail et du dépôt.
la source