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?

È stato utile?

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 / -"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top