Imposible desplegar con rails y capistrano, "HEAD no es lo mismo que origin / master"

Sigo recibiendo un error al intentar implementar con capistrano en mi server remoto. Me está diciendo que mis files locales no están sincronizados hasta el repository remoto, pero cuando git push recibo el post Everything is up-to-date . No estoy seguro de cuál es el problema. También he comprobado el rev-parse para origen y HEAD y devuelven los mismos valores.

Error:

 WARNING: HEAD is not the same as origin/master Run `git push` to sync changes. (Backtrace restricted to imported tasks) cap aborted! SSHKit::Runner::ExecuteError: Exception while executing on host [IP address] exit SystemExit: exit Tasks: TOP => deploy:starting => deploy:check_revision (See full trace by running task with --trace) The deploy has failed with an error: Exception while executing on host [IP address]: exit 

deploy.rb

 # Change these server '[ipaddress]', port: 22, roles: [:web, :app, :db], primary: true set :repo_url, 'git@github.com:name/rails_site.git' set :application, 'rails_site' set :user, 'deploy' set :puma_threads, [4, 16] set :puma_workers, 0 # Don't change these unless you know what you're doing set :pty, true set :use_sudo, false set :stage, :production set :deploy_via, :remote_cache set :deploy_to, "/home/#{fetch(:user)}/apps/#{fetch(:application)}" set :puma_bind, "unix://#{shanetworking_path}/tmp/sockets/#{fetch(:application)}-puma.sock" set :puma_state, "#{shanetworking_path}/tmp/pids/puma.state" set :puma_pid, "#{shanetworking_path}/tmp/pids/puma.pid" set :puma_access_log, "#{release_path}/log/puma.error.log" set :puma_error_log, "#{release_path}/log/puma.access.log" set :ssh_options, { forward_agent: true, user: fetch(:user), keys: %w(~/.ssh/id_rsa.pub) } set :puma_preload_app, true set :puma_worker_timeout, nil set :puma_init_active_record, true # Change to false when not using ActiveRecord ## Defaults: set :scm, :git set :branch, :master set :format, :pretty set :log_level, :debug set :keep_releases, 5 ## Linked Files & Directories (Default None): # set :linked_files, %w{config/database.yml} # set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system} namespace :puma do desc 'Create Directories for Puma Pids and Socket' task :make_dirs do on roles(:app) do execute "mkdir #{shanetworking_path}/tmp/sockets -p" execute "mkdir #{shanetworking_path}/tmp/pids -p" end end before :start, :make_dirs end namespace :deploy do desc "Make sure local git is in sync with remote." task :check_revision do on roles(:app) do unless 'git rev-parse HEAD' === 'git rev-parse origin/master' puts "WARNING: HEAD is not the same as origin/master" puts "Run `git push` to sync changes." exit end end end desc 'Initial Deploy' task :initial do on roles(:app) do before 'deploy:restart', 'puma:start' invoke 'deploy' end end desc 'Restart application' task :restart do on roles(:app), in: :sequence, wait: 5 do invoke 'puma:restart' end end before :starting, :check_revision after :finishing, :compile_assets after :finishing, :cleanup after :finishing, :restart end # ps aux | grep puma # Get puma pid # kill -s SIGUSR2 pid # Restart puma # kill -s SIGTERM pid # Stop puma 

EDITAR:

 $ git status On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean $ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master 

No sé por qué escribiste esto:

 unless 'git rev-parse HEAD' === 'git rev-parse origin/master' 

en lugar de esto:

 unless `git rev-parse HEAD` === `git rev-parse origin/master` 

Si es un error tipográfico, eliminaré esta respuesta. Si no, estás comparando cadena en lugar de resultado de commands.

también puedes usar:

 unless %x{git rev-parse HEAD} === %x{git rev-parse origin/master} 

ver más en la definición del método También prefiero utilizar == en lugar de === (pero para cadenas es el mismo).

De acuerdo, tengo una solución para ti. Lo probé en mi máquina y funciona. Tenga en count que esto se siente como un truco y puede que no sea la respuesta más eficiente. Sin embargo, funciona.

Siga estos pasos para eliminar su proyecto existente, clonar uno nuevo y fusionar lo que tiene localmente con lo que tiene en git:

 # back out of your project cd .. # delete your project sudo rm -r yourproject # clone fresh instance of your project git clone https://github.com/yourusername/yourproject.git # navigate to your project cd yourproject # remove .git folder sudo rm -r .git # initialize a new .git git init # add all files for upcoming commit/merge git add . # set commit git commit -m "refreshed sync" # set remote origin to merge with git remote add origin https://github.com/yourusername/yourproject.git # make a pull to merge the two # you will enter a nano screen to enter comment # press CTRL + X to continue git pull https://github.com/yourusername/yourproject.git # push to remote location and set upstream git push --set-upstream origin master # Now you're all set! 

Usa la git branch para verificar si estás en una twig diferente. Si su server usa la twig principal, entonces el process de git checkout master git push resuelve mi problema.