Je sais que des questions similaires ont été posées à plusieurs reprises, mais je ne peux pas les faire fonctionner pour mon cas.

Où je suis: J'ai un dépôt local que je pousse vers un serveur en direct, qui comprenait un dossier / content et ses sous-dossiers. Pendant la production, c'était bien, car je pouvais apporter des modifications à / content et simplement les pousser. Mais comme il s'agit d'un site Web utilisant un CMS, toutes les modifications apportées à / contenu seront désormais produites à distance.

Où je veux être: Je veux maintenant «détacher» / content et ses sous-dossiers de la base de code, afin de pouvoir supprimer le dossier hefty / content localement sans qu'il soit supprimé sur le serveur en direct. De cette façon, je pourrais toujours apporter des modifications au code et les pousser sur le serveur, tandis que les gens peuvent utiliser le CMS pour créer des fichiers et des modifications dans le dossier / content.

Alors ce que j'ai fait jusqu'à présent:

  1. a ajouté le dossier à .gitignore:

/content/

  1. supprimé le dossier de l'index:

git rm -r --cached content/*

  1. essayé de définir supposer inchangé afin que, lors de la transmission, les fichiers de / content ne soient pas supprimés du serveur en direct:

git update-index --skip-worktree

Quand je fais cela, j'obtiens bien sûr un:

fatal: impossible de marquer le fichier

Étant donné que les fichiers sont au format .gitignore et qu'ils doivent y rester, le dossier sera ignoré à l'avenir. Alors qu'est-ce que je fais?

0
lthz 23 mai 2018 à 13:17

3 réponses

Meilleure réponse

Mise à jour pour refléter la correction d'OP, que les mises à jour ont été effectuées sur le clone local plutôt que sur le serveur, et que le serveur est un dépôt nu avec un hook qui met à jour le dossier de travail via checkout -f


Les indicateurs d'index (skip-worktree ou assume-unchanged) ne sont pas la solution au problème, mais votre compréhension du pourquoi (que cela a quelque chose à voir avec .gitignore) n'est pas non plus correcte. Au contraire, ces indicateurs sont définis sur l'entrée du fichier dans l'index; vous ne pouvez pas définir l'indicateur sur ces fichiers car vous avez supprimé les fichiers de l'index.

Vous avez précisé que les trois étapes que vous mentionnez (créer .gitignore, exécuter rm --cached, tenter de définir des indicateurs d'index) ont été effectuées sur le clone local. La question suivante serait donc de savoir comment synchroniser cela avec le serveur, sans supprimer le répertoire content du serveur.

L'index, comme l'arbre de travail, est local. Le serveur ne sait donc pas encore que vous avez fait quoi que ce soit. La prochaine fois que vous effectuez un commit et que vous le poussez, vous devrez prendre des mesures pour mettre à jour correctement le serveur (sinon le répertoire de contenu sera perdu). Je recommande de le faire maintenant, pour ne pas avoir de changements supplémentaires à jongler en même temps (et pour ne pas oublier de faire les étapes supplémentaires).

Vous aurez besoin de faire des allers-retours entre le local et le serveur, donc j'irais de l'avant et ouvrirais un shell sur chacun.

Sur le serveur , vous devez empêcher que l'arbre de travail ne soit automatiquement mis à jour par la prochaine diffusion. Étant donné que votre dépôt côté serveur est vide et que la mise à jour se produit via un hook, désactivez le hook. (Soit déplacez le script de post-réception hors du répertoire hooks, soit modifiez-le et commentez les lignes qui récupèrent les modifications.)

Maintenant, localement , vous devez mettre en scène le fichier .gitignore et valider les modifications (qui incluront la suppression (de l'index) du répertoire content), et pousser:

git add .gitignore
git commit
git push

Maintenant sur le serveur , vous devez synchroniser l'arborescence de travail et réactiver le hook. Puisque le seul changement (autre que la suppression du dossier content) était le fichier .gitignore

git checkout --work-tree /path/to/webroot -- .gitignore

Synchronisera les choses. Ensuite, annulez tout ce que vous avez fait pour désactiver le hook.

0
Mark Adelsberger 23 mai 2018 à 15:16

Vous ne devez pas utiliser git comme outil de déploiement.

Ce que vous pouvez faire: avoir un dépôt distant sans le dossier de contenu. Ajoutez un dossier de contenu à .gitignore. Demandez à votre serveur en direct de tirer de ce dépôt distant. Cela ne changera pas le contenu de votre dossier de contenu.

Alternative: placez votre contenu quelque part en dehors de votre dossier git.

Modifier : pour résoudre votre problème: procédez comme suit sur la télécommande :

git rm -r --cached content/*
git commit -m "content deleted"

Puis sauvegardez votre dossier de contenu local et git pull.

-1
Fabian H. 23 mai 2018 à 12:14

Juste pour clarifier le concept de gitignore d'abord,

  • Le fichier .gitignore indique que je ne détecte pas ces fichiers et dossiers dans le cadre du système de contrôle de version.
  • Si le fichier fait déjà partie du système de contrôle de version et si vous essayez de l'ignorer, il ne sera pas ignoré.
  • Vous ne pouvez pas ignorer les fichiers qui font partie du répertoire distant. Ce n'est que lorsque vous le supprimez du référentiel distant et que vous ajoutez le dossier dans gitignore, il sera ignoré. Remarque: vous n'aurez pas de contenu / sur le dépôt distant dans ce cas.

Meilleure solution :

Laissez-le être sur un référentiel distant et vous ne validez pas les fichiers de ce dossier.

J'espère que cela ajoute de la valeur à votre question

-1
RoshanKumar Mutha 23 mai 2018 à 11:10