web-dev-qa-db-fra.com

Différence entre deux répertoires / projets entiers en hg ou git?

J'ai hérité d'un projet initialement stocké dans CVS avec toutes les révisions. J'ai fait pas mal de modifications, et j'essaie de comparer toutes les modifications que j'ai apportées dans le répertoire d'origine, en ce qui concerne les nouveaux fichiers ajoutés par rapport aux anciens.

Existe-t-il une sorte d'utilité pour hg/git où je peux faire un diff d'arbre, ou quelque chose de cette nature? Donc cela dit, il y a une marque entre les fichiers nouvellement ajoutés, les fichiers supprimés, est-ce que j'en demande trop?

48
meder omuraliev

git diff fait exactement cela. mais cela ne fonctionne que pour les projets git.

hg diff, svn diff à peu près tous les systèmes de contrôle de version peuvent différer les arborescences de répertoires

2
knittl

Pour créez simplement un patch diff au format diff de git à partir de deux fichiers ou répertoires arbitraires, sans aucun truc de référentiel ni contrôle de version:

git diff --no-index some/path other/path >> some_filename

Le commentaire de Jakub Narębski sur la réponse de knittl faisait allusion à la réponse ... Par souci de simplicité, c'est la pleine commande.

Le >> part crée un fichier et y redirige la sortie. Si vous ne voulez pas de fichier et que vous voulez juste que la sortie soit imprimée dans votre console pour pouvoir le copier, supprimez simplement le >> some_filename partie.


Pour un copier-coller pratique, si vous avez déjà cdenregistré dans un répertoire contenant le répertoire/fichier d'origine nommé a et le répertoire modifié b, ce sera:

git diff --no-index a b >> patch
76
user568458

De page de manuel git diff :

git diff [--options] [--] [<path>...]

[...]
Si exactement deux chemins sont indiqués et qu'au moins un n'est pas suivi, comparez les deux fichiers/répertoires. Ce comportement peut être forcé par --no-index.


Si vous souhaitez comparer deux versions (par exemple deux versions marquées ou deux branches) dans deux référentiels différents, vous pouvez utiliser l'astuce décrite dans la page GitTips sur Git Wiki, sous "Comment comparer deux référentiels locaux" .

En supposant que vous êtes dans un référentiel et que le deuxième référentiel se trouve dans /path/to/repo, Son GIT_DIR est donc /path/to/repo/.git S'il s'agit d'un référentiel non nu, vous pouvez quelque chose comme ceci:

$ GIT_ALTERNATE_OBJECT_DIRECTORIES=/path/to/repo/.git/objects \
   git diff $(git --git-dir=/path/to/repo/.git rev-parse --verify A) B

où A et B sont des révisions que vous souhaitez comparer. Bien sûr, vous pouvez également spécifier un limiteur de chemin dans l'expression ci-dessus.

Explication: La variable GIT_ALTERNATE_OBJECT_REPOSITORIES Peut être utilisée pour que les commandes git concaténent la base de données d'objets des deux référentiels. git --git-dir=... rev-parse ... Est utilisé pour transformer le nom (expression SHA-1 étendue) dans le référentiel donné en paramètre de l'option git-dir En identifiant SHA-1 unique. La construction $( ... ) place le résultat de l'appel d'une commande donnée en ligne de commande. git diff Est utilisé pour comparer deux révisions (où l'une provient d'un référentiel d'objets alternatif).

Une autre solution consisterait à simplement importer un autre référentiel dans un référentiel donné, en utilisant git remote add (Et git fetch). Ensuite, vous auriez tout localement et vous pourriez faire la comparaison à l'intérieur d'un référentiel unique.

22
Jakub Narębski

Existe-t-il une sorte d'utilitaire pour hg/git où je peux faire un diff d'arbre ... [s] o qui dit, il y a une marque entre les fichiers nouvellement ajoutés, les fichiers supprimés ... [emphase ajoutée]

Oui. Nous pouvons git diff le répertoire courant contre un autre répertoire et ...

... marquez les fichiers ajoutés, supprimés et modifiés:

git diff --name-status --no-index ./ path/to/other/dir

... n'afficher que les fichiers ajoutés:

git diff --diff-filter=A --name-status --no-index ./ path/to/other/dir

... n'afficher que les fichiers supprimés:

git diff --diff-filter=D --name-status --no-index ./ path/to/other/dir

... n'afficher que les fichiers modifiés:

git diff --diff-filter=M --name-status --no-index ./ path/to/other/dir

Voir aussi: https://git-scm.com/docs/git-diff

9
Shaun Luttin

Je ne comprends pas vraiment ce que tu veux, mais n'est pas diff -ur assez pour toi? Cela fonctionnera même sur les répertoires sans aucun type de contrôle de version.

7
Thiago Arrais

Ce n'est pas spécifique à git, mais en tant qu'utilitaire de diff général pour Windows, j'aime vraiment WinMerge .

7
Andy West