Hi zusammen,
ich nutze seit einiger Zeit das Versionierungstool GIT für die Entwicklung meiner Shellscripte. Nun ist mir im meinen Arbeitsverzeichnis aufgefallen, dass wenn ich eine Datei lösche oder verschiebe diese nicht mehr in git auftaucht zumindest nicht bei dem Kommando git log. Ist das so gewollt von GIT?
Ich finde das etwas verwirrend, weil ich alle jemals versionierten Scripte in meinen Arbeitsverzeichnis lassen müsste. Ziemlich unübersichtlich auf Dauer. Kann man das anders lösen?
$ git log cjob.sh
fatal: ambiguous argument 'cjob.sh': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
Wenn ich das Script "cjob.sh" wieder ins Arbeistverzeichnis stelle listet mir GIT die ganze Historie zu diesen File wieder auf.
Hi. Problem ist bekannt. Ich muss nur noch sehen, dass ich die Lösung wieder finde. Ist eigentlich recht trivial, aber ich habs vergessen oder verdrängt. Auch die Seite, wo ich das gefunden habe. Ich habs aber irgendwo notiert. :)
EDIT: Du suchst, glaube ich, das hier:
http://stackoverflow.com/questions/2314652/is-it-possible-to-move-rename-files-in-git-and-maintain-their-history
Hi agaida,
in dem Link von dir ist von git mv also ein Umbenennen des versionierten Files die Rede. Ich versteh den Zusammenhang mit meinen Problem nicht oder habe ich da was übersehen?
Naja, deine Frage ist mir auch nicht so 100% klar. Suchst Du eventuell git rm --cached <file>
greetz
devil
Quote from: "bluelupo"Hi agaida,
in dem Link von dir ist von git mv also ein Umbenennen des versionierten Files die Rede. Ich versteh den Zusammenhang mit meinen Problem nicht oder habe ich da was übersehen?
Dem Verlust der Historie geht immer ein mv voraus. Irgendwie muss das File ja umbenannt werden. Und dann hat es auf den ersten Blick keine Historie mehr, aus Performancegründen. Den Zusammenhang, wenn ich dich richtig verstanden habe, findest Du in der Antwort explizit.
Quote
To lookup the full history use the following command:
git log --follow ./path/to/file
Du kannst keine Historie in einem Verzeichnis für etwas anzeigen, was nicht mehr da ist. Das ginge eventuell mit git-grep und git-filterbranch.
Quote from: "agaida"
[...]
Quote
To lookup the full history use the following command:
git log --follow ./path/to/file
Du kannst keine Historie in einem Verzeichnis für etwas anzeigen, was nicht mehr da ist. Das ginge eventuell mit git-grep und git-filterbranch.
Hi agaida,
d.h. also alle schon mal mit GIT versionierten Files müssen zwangsläufig im Arbeitsverzeichnis bleiben bloß um die Historie angezeigt zu bekommen.
Ich arbeite in der Regel immer etwas anders wenn ich etwas versionieren will. Ich kopiere mir das zu bearbeitende File in das GIT Arbeitsverzeichnis und bearbeite es. Wenn's fertig ist ein ADD, COMMIT und dann würde ich gerne das File im Arbeitsverzeichnis löschen. Dann habe ich aber geschildertes Probleme. Klar das ich kein DIFF oder ähnliches machen kann aber zumindest würde ich gerne die Historie sehen. Aber okay scheint nicht machbar zu sein.
@redfox:~/project$ mv cjob.sh ..
@redfox:~/project$ git log cjob.sh
fatal: ambiguous argument 'cjob.sh': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
@redfox:~/project$ git log --follow cjob.sh
fatal: ambiguous argument 'cjob.sh': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
@redfox:~/project$ git log --follow ../cjob.sh
fatal: '../cjob.sh' is outside repository
So, nachdem ich mich vom Rumrollen auf den Boden ein wenig erholt habe: Kenn ich, diese Probleme. Da kann ich Dir aber eine kleine Hilfestellung geben, die eventuell anfangs nicht ganz einleuchtend ist: Vergiss einfach, dass Git eine Versionsverwaltung ist.
Die Planung von Git durch Linux sieht eigentlich was ganz anderes vor. Stell Dir git einfach als versionierendes Dateisystem vor, auf dem ganz normale Dateioperationen ablaufen - Mit einer Erweiterung: Es werden Versionen gehalten. Wenn das mal fertig ist, soll man es als Dateisystem benutzen können.
Für die Verfolgung von Dateien und zum Nachvollziehen von Änderungen gibt es einiges an Werkzeug, von Boardmitteln wie gitk oder gitui über gitcola (alles in den Repositories), Tortoise, Smartgit und nicht zu vergessen Webtools wie gitweb und cgit.
Zu Deinem Speziellen Problem: Das ist so nicht machbar, das geht am Thema jeglicher Versionsverwaltung vorbei. Eine Möglichkeit gibt es aber schon: Für Sachen, die Du eventuell auch später Versioniert halten willst, legst Du ein Verzeichnis in Deinem "Arbeitsgit" an.
Wenn das Projekt da nicht mehr erscheinen soll, dann einfach:
git clone file://arbeitsgit tmpgit
cd tmpgit
git status
git filter-branch --subdirectory-filter /path/to/keep -- --all
cd ..
git clone file://tmpgit zielgit
rm -rf tmpgit
Danach hast Du ein versioniertes Zielverzeichnis mit nur den von Dir gewünschten Daten und deren Historie. Eine einfachere Variante: Man nehme sich sein Projektverzeichnis und fange neue Sachen mit
mkdir mein_neues_projekt
cd mein_neues_projekt
git init
touch README
git add README
git commit -m "initial commit"
an.
Wenn fertig, das Projektverzeichnis nach /usr/share/MeinNeuesScript clonen und in /usr/bin oder sonstwo dahin verlinken.