2009-01-23 3 views
5

Ich habe ein Remote-Git Repo und einen lokalen Klon. Angenommen, ich verliere mein lokales .git-Verzeichnis und fügt anschließend einige Dateien zum lokalen Arbeitsverzeichnis hinzu und entferne sie.Bei der Verwendung von Git, wie schiebt man das genaue Arbeitsverzeichnis auf eine Fernbedienung?

Irgendwann möchte ich das lokale Repo neu initialisieren, es mit der Fernbedienung verbinden und schließlich mein lokales Arbeitsverzeichnis an die Fernbedienung genau so wie es ist (das heißt, ich möchte alle haben hinzugefügte/gelöschte Dateien sind die gleichen in der Fernbedienung)

Wie würde ich das erreichen?

Hier ist meine aktuelle Lösung, die ich nicht mag (und möglicherweise nicht in allen Fällen funktioniert).

git init

git remote hinzufügen Herkunft [some_url]

git add. # Fügt alle Dateien im Arbeitsverzeichnis

git commit -m "Hinzufügen von Dateien"

(An dieser Stelle meine aktuelle Idee ist:

  • einen Zweig machen,

  • die Fernbedienung in sie holen,

  • 'master branch git diff> my_patch'

  • anwenden, das Pflaster auf die Zweig,

  • Push aus dem Zweig an den entfernten,

  • Pull in den Master,

  • und den Zweig töten.)

Offensichtlich ist meine Idee ziemlich komplex und hässlich. Irgendwelche Ideen?

Antwort

9

So etwas (vorausgesetzt, Sie beginnen mit dem verlorenen .git Moment)?

# Make the current directory a git repository. 
# This puts you on a master branch with no commits. 
git init 

# Add a reference to the remote repository. 
git remote add origin urlurlurl 

# Fetch the remote refs. 
git fetch 

# Without touching the working tree, move master branch 
# from nowhere onto the remote master. 
git reset origin/master 

# Stage all changes between the new index and the current tree. 
git add -A 

# Make a commit of these changes. 
git commit -m "New working tree as a patch on remote master" 
+0

Das ist perfekt! Vielen Dank! –

0

Entschuldigung, wenn ich dich missverstanden habe, aber ich denke, du willst nur den Standard ziehen und schieben? Have a read of this. Git kümmert sich um alle Zusammenführungen für Sie, und wenn es Konflikte gibt, können Sie sie leicht aussortieren.

+0

Nein, leider glaube ich nicht, Standard-Push und Pull wird für mich arbeiten. Nehmen wir an, die Datei 'foo.txt' existiert im Remote-Repo, aber nicht in meinem lokalen Verzeichnis (das sich noch nicht unter Quellcodeverwaltung befindet). Wenn ich 'Git init' mache, füge die Fernbedienung hinzu und ziehe - es wird foo.txt erstellen! –

+0

Entschuldigung, ich muss dich missverstehen. Ja, es wird foo.txt erstellt. Git-Repositories sind Kopien von einander. – dylanfm

+0

Ja, ich möchte nur einen Weg finden, Git zu sagen: "Nimm den Unterschied zwischen dem aktuellen Arbeitsverzeichnis und der Fernbedienung und lege es auf die Fernbedienung an!" –

3

Ich glaube nicht, dass es notwendig ist, einen neuen Zweig in Ihrem Fall zu erstellen. Hier ist meine Antwort: Gehen Sie wie folgt in Ihrem aktuellen lokalen gebrochen Repo:

git init 
git add . 
git commit -m 'add files' #create the local master branch 
git remote add myproj [some_url] 
git fetch myproj 
git branch -r #check the remote branches 
git diff master..myproj/master #view the diffs between your local and remote repos 
#now you are sure there is no conflict, 
#so you merge the remote to your local master branch 
git pull myproj master 
git push myproj #push your local master branch to remote 
#now your upstream and downstream is sync'ed 
1

Hier ist meine aktuelle Lösung (sagen wir, ich bin schon in dem Verzeichnis, das die aktuellen Dateien enthält, ist aber erhalten keine git Repo)

git clone -n [git_url] tmp_git_dir 
mv tmp_git_dir/.git . 
rm -rf tmp_git_dir 
git add . 
git commit -a -m "commit message" 

Dies scheint einfacher und wird automatisch Dateien hinzufügen und entfernen wie nötig. Ich denke, es ist auch effizienter.

Ich frage mich - gibt es eine Möglichkeit, das Git Repo in das aktuelle Verzeichnis zu klonen (im Grunde will ich nur das .git Verzeichnis im aktuellen Verzeichnis, so dass ich nicht mv und rm tun muss)?