GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Git und Hardlinks

Ich habe herausgefunden, dass man mit Hooks den git pull erfassen kann Ereignis (wenn es etwas zu ziehen gibt ...) Schreiben des Skript-Ereignishandlers in .git/hooks/post-merge Datei.

Zuerst müssen Sie chmod +x es.

Geben Sie dann ln ein darin enthaltene Befehle, um harte Links bei jedem Pull neu zu erstellen. Ordentlich huh!

Es funktioniert, ich brauchte das nur für mein Projekt und ls -i zeigt, dass Dateien nach pull automatisch verlinkt wurden .

Mein Beispiel von .git/hooks/post-merge :

#!/bin/sh
ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf

WICHTIG:Wie Sie sehen können, sollte der Pfad zu jeder Datei in Ihrem Repository mit $GIT_DIR beginnen , und fügen Sie dann den partiellen relativen Pfad zur Datei hinzu.

Auch wichtig:-f ist erforderlich, da Sie die Zieldatei neu erstellen.

BEARBEITEN

Der moderne Git-Client scheint natürlich Symlinks und Hardlinks innerhalb des Repositorys zu unterstützen, selbst wenn er an einen entfernten Ort verschoben und dann von dort geklont wird. Ich hatte jedoch nie wieder das Bedürfnis, außerhalb eines Git-Repos zu verlinken ...

$ mkdir tmp
$ cd tmp
$ git --version
git version 2.24.3 (Apple Git-128)
$ git init .
Initialized empty Git repository in /Users/teixeira/tmp/.git/
$ mkdir x
$ cd x
$ echo 123 > original
$ cat original
123
$ cd ..
$ ln -s x/original symlink
$ cat symlink
123
$ ln x/original hardlink
$ cat hardlink
123
$ git add .
$ git commit -m 'Symlink and hardlink commit'
[master (root-commit) 8df3134] Symlink and hardlink commit
 3 files changed, 3 insertions(+)
 create mode 100644 hardlink
 create mode 120000 symlink
 create mode 100644 x/original

Klonen aus lokalem Git-Repository

$ cd
$ git clone tmp/ teste_tmp
Cloning into 'teste_tmp'...
done.
$ cd teste_tmp/
$ ls
hardlink  symlink  x
$ cat symlink
123
$ cat hardlink
123

Klonen aus einem entfernten Repository

$ cd ~/tmp
$ git remote add origin https://github.com/myUser/myRepo.git
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 361 bytes | 361.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://github.com/myUser/myRepo.git
 + 964dfce...8df3134 master -> master
$ cd ../
$ git clone https://github.com/myUser/myRepo.git
Cloning into 'myRepo'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
$ cd myRepo/
$ cat symlink
123
$ cat hardlink
123

https://github.com/mokacoding/symlinks weist auch auf eine wichtige Sache hin:Symlinks müssen relativ definiert werden.


Das „Baum“-Objekt, das Verzeichnisse in Git darstellt, speichert Dateinamen und (Teilmenge von) Berechtigungen. Es speichert keine Inode-Nummer (oder eine andere Art von Datei-ID). Daher harte Links kann nicht in Git dargestellt werden , zumindest nicht ohne Tools von Drittanbietern wie Metastore oder Git-Cache-Meta (und ich bin mir nicht sicher, ob es sogar mit diesen Tools möglich ist).

Git versucht, keine Dateien zu berühren, die es nicht aktualisieren muss, aber Sie müssen berücksichtigen, dass Git nicht versucht, Hardlinks zu erhalten, sodass sie von Git beschädigt werden können.

Über symbolische Links, die außerhalb des Repositorys verweisen :git hat keine Probleme mit ihnen und sollte den Inhalt symbolischer Links bewahren ... aber die Nützlichkeit solcher Links ist für mich zweifelhaft, da ob diese symbolischen Links kaputt gehen oder nicht, vom Dateisystem-Layout außen abhängt. em> git-Repository und nicht unter der Kontrolle von git.


Aus diesem msysgit-Problem

Verbindungspunkte sind keine symbolischen Links; daher werden symbolische Links in msysGit einfach nicht unterstützt.

Außerdem wurden harte Links nie von Git verfolgt .

Das Thema war Windows-orientiert (da es um msysgit geht) und eine Debatte über die mögliche Unterstützung von Symlink.
Aber der Kommentar zum Hardlink betrifft Git im Allgemeinen.


Linux
  1. Hardlinks und Softlinks in Linux erklärt

  2. Der Unterschied zwischen symbolischen und harten Links?

  3. So erstellen Sie Soft- und Hardlinks in Linux

  4. RHEL 7 – RHCSA-Hinweise:Erstellen Sie harte und weiche Links.

  5. Was sind Softlinks und Hardlinks im Linux-Dateisystem?

Was ist Git und wie installiert man Git unter Linux?

So installieren und verwenden Sie Git in einem Linux-System

Der ln-Befehl unter Linux:Soft- und Hardlinks erstellen

Installation und erste Schritte mit Git

Hardlinks und Softlinks in Linux:Alles, was Sie wissen müssen

rsync und symbolische Links