2013-08-19 13 views
5

Ho uno sviluppatore che lavora su una cartella e un'altra che lavora su un'altra. Vorrei aggiornare la produzione con una cartella specifica Sto cercando un comando come:Git recupera solo una directory

cd /myproject 
git pull myfolder 

e si aspettano che solo myfolder verrà aggiornato

è possibile?

ok, riformulerò ... Ho un progetto, un ramo e due sviluppatori e due cartelle nel progetto. ogni sviluppatore lavora su una cartella. entrambi apportano modifiche e li spingono nel ramo.

voglio tirare solo le modifiche di una cartella nella mia macchina locale

Basic/Semplice non è vero?

+0

La tua domanda non è molto chiaro . Diciamo che hai le cartelle 'dev1',' dev2' e 'production'. Stai chiedendo come introdurre tutte le modifiche da 'production' da un altro ramo, o stai chiedendo come impostare essenzialmente il contenuto di' production' su una delle cartelle di sviluppo? Ad ogni modo, il modo in cui ti stai avvicinando a questo suona come il tuo lavoro contro lo strumento. – jszakmeister

+0

ok, riformulerò ... Ho un progetto, un ramo e due sviluppatori e due cartelle nel progetto. ogni sviluppatore lavora su una cartella. entrambi apportano modifiche e li spingono nel ramo. Voglio inserire solo le modifiche di una cartella nel mio computer locale – fredy

+0

Stai utilizzando Git per gestire una copia di lavoro? O stai davvero cercando di ottenere il contenuto di una cartella nel repository sul tuo computer? A giudicare dal tuo commento su PherricOxide, suona come il secondo. – jszakmeister

risposta

1

Avete qualche tipo di filiale di produzione? Assumendo una dev e ramo di produzione ...

# Get all the changes from the dev branch 
git checkout dev 
git pull origin dev 

# Checkout the production branch 
git checkout production 

# Checkout the dev version of the folder you want 
git checkout dev myfolder 

# Commit all the changes that are now showing up. 

Questa è una sorta di un modo terribile di fare le cose, perché stai perdendo la cronologia delle modifiche quando voi verifica e reimpegnarci solo quella cartella.

+0

Grazie ma forse non ero molto chiaro ... voglio ottenere solo gli aggiornamenti di una cartella. non voglio fare nessun checkout Diciamo che entrambi gli sviluppatori hanno fatto qualche commit allo stesso ramo ma voglio ottenere solo le modifiche di una cartella – fredy

+0

Il tuo terzo comando di checkout non è corretto. Dovrebbe essere 'git checkout dev - myfolder' (vengono scambiati' dev' e 'myfolder'). – jszakmeister

4

Assumendo cosa si sta realmente chiedendo è quello di afferrare in remoto i file da un repository git , senza avere un albero di lavoro del proprio (o un clone del repository localmente), si potrebbe fare questo:

git archive --format=tgz --remote=<url-to-repo> master -- myfolder | tar zxvf - 

Questo dice di creare una sfera tar tarata con gzip del ramo master del repository che vive a <url-to-repo>, ma include solo il contenuto sotto myfolder. Piping che attraverso tar disarchivia i dati e li inserisce nella directory di lavoro corrente .

Se stai effettivamente cercando di gestire un albero di lavoro e lavori con gli altri due sviluppatori , allora quello che stai chiedendo di fare va davvero contro lo strumento dello strumento . Ma dovresti essere molto più elaborato su ciò che stai cercando di fare in modo che qualcuno possa fare un buon suggerimento sul flusso di lavoro.

Aggiornamento:

in modo che non suoni come se si vuole prendere un solo cambiamenti della cartella in un albero di lavoro gestito . Ci dispiace, ma Git non funziona in questo modo. Come ho detto nei commenti di qui sotto, Git gestisce alberi di file. Non consente che una parte di un albero sia in una revisione e che un'altra parte sia in una revisione diversa come che stai suggerendo - forse sei un utente precedente di Subversion dove era possibile?

È possibile ottenere un effetto simile a quello che si desidera, ma è necessario modificare la copia di lavoro . Non lo farei commit la modifica a meno che non si desideri scartare uno dei tuoi sviluppatori lavoro.Si potrebbe a questo:

$ git fetch 
$ git checkout @{u} -- myfolder 

git fetch porterà i tuoi riferimenti remoti fino ad oggi - che verrà recuperato il ultime informazioni dai server. git checkout @{u} -- myfolder farà sì che myfolder assomigli a ciò che esiste nel ramo di monitoraggio. Questo ha due conseguenze:

  • Non hai tutti i cambiamenti sulla vostra filiale locale (e si non li desidera, in modo che va bene), e

  • myfolder mostreranno come modificato in quanto il contenuto di myfolder ha aggiornato con l'ultimo disponibile dal repository remoto, ma è diverso dalla revisione corrente.

per ottenere la vostra copia di lavoro di nuovo al normale, fare questo:

$ git checkout -- myfolder 

Da lì, si chiama seguire il vostro meccanismo di solito per ottenere il vostro ramo up-to-date con il telecomando (probabile git pull).

Questo, tuttavia, probabilmente non è il modo in cui si desidera operare. Nonostante il tuo commento, "non importa il caso d'uso", è davvero importante. Spesso ci sono modi migliori per fare il tuo obiettivo generale e gestire lo sviluppo, ma è che richiede capire cosa stai cercando di fare. Al momento, ciò che proponete, , va davvero contro il modo in cui Git intende funzionare.

Quindi lascia che metta un po 'di cose là fuori per voi. Ricerca utilizzando i rami argomento come metodo per gestire il lavoro di sviluppo in corso, piuttosto che utilizzare le cartelle per ogni sviluppatore nella struttura. Modifiche chiare e logiche possono essere apportate sui rami e unite mentre vengono testati e approvati per l'inclusione nella produzione.

Un buon punto di partenza è here. Contiene una buona quantità di informazioni e alcuni seguono i collegamenti a diversi stili di flussi di lavoro Git. Il luogo in cui desideri terminare è dove c'è un commit che rappresenta la versione effettivamente inserita nella produzione , senza distruggere il lavoro che altri stanno facendo per te. Idealmente, taggare ciò che è stato spinto in produzione in modo significativo.

So che a nessuno piace ascoltarlo, ma la formazione potrebbe essere molto utile nel tuo caso. GitHub offre alcune free online classes e diverse altre risorse. A giudicare dall'esperienza, una volta capito come funziona Git e i problemi che risolve, avrai un flusso di lavoro molto migliore.

+0

Ho un repository locale che è aggiornato. Ora entrambi gli sviluppatori hanno apportato modifiche, ciascuno nella sua cartella. voglio "prendere" solo le modifiche da una cartella Posso farlo? – fredy

+0

Se è aggiornato, non hai già le sue modifiche allora? Che cosa hai provato? Dovresti aggiornare la tua domanda con quella informazione. – jszakmeister

+0

diciamo che ho tirato tutto sul mio PC. poi le due cartelle sono state aggiornate. oggi voglio ottenere solo i cambiamenti da una cartella. posso farlo? – fredy

0

Sì, è facile inserire una sottodirectory Git nella casella git fetch. Supponiamo di avere la seguente directory di progetto nel tuo git-repo remoto.

project/ 
    ├── code 
    └── data 

Per il momento, si supponga di aver clonato il progetto sul proprio filesystem locale come repository git.

$ cd project 
$ rm -rf code 

#now we try to fetch the "code" directory. 
$ git fetch 
$ git checkout HEAD code 

Nel caso tu abbia nidificato struttura delle directory come,

project/ 
├── code 
│   ├── dev 
│   └── test 
└── data 

allora in questo caso si dovrebbe utilizzare la directory specifica che si desidera,

$ git checkout HEAD code/dev 
Problemi correlati