Come posso spostare una directory in un repo Git per tutti i commit?
-
01-10-2019 - |
Domanda
dire Let ho un pronti contro termine che include questa struttura di directory:
repo/
blog/
_posts/
some-post.html
another-file.txt
voglio passare _posts
al livello superiore del pronti contro termine, in modo che la struttura sarà simile a questa:
repo/
_posts/
some-post.html
another-file.txt
Questo è abbastanza semplice con git mv
, ma voglio rendere il look storia come se _posts
sempre esistenti alla radice del pronti contro termine, e voglio essere in grado di ottenere l'intera storia del some-post.html
via git log -- _posts/some-post.html
. Immagino che posso usare qualche magia con git filter-branch
per raggiungere questo obiettivo, ma non ho capito esattamente come fare. Tutte le idee?
Soluzione
È possibile utilizzare il filtro sottodirectory per raggiungere questo obiettivo
$ git filter-branch --subdirectory-filter blog/ -- --all
Modifica 1: Se non si vuole fare in modo efficace _posts
la radice, utilizzare un albero-filtro, invece:
$ git filter-branch --tree-filter 'mv blog/_posts .' HEAD
EDIT 2: Se blog/_posts
non esistesse in alcuni dei commit, quanto sopra non riuscirà. Utilizzare questo, invece:
$ git filter-branch --tree-filter 'test -d blog/_posts && mv blog/_posts . || echo "Nothing to do"' HEAD
Altri suggerimenti
Mentre la risposta di Ramkumar è molto utile e staff era, esso non funziona in molte situazioni. Ad esempio, quando si desidera spostare una directory con altre sottodirectory in una nuova posizione.
Per questo, la pagina man contiene il comando perfetto:
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&NEWSUBDIR/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
Basta sostituire NEWSUBDIR con la nuova directory desiderata. È inoltre possibile utilizzare dirs nidificate come dir1 / dir2 / dir3 / -"