Поддерживайте удаленный каталог в актуальном состоянии - PullRequest
38 голосов
/ 13 августа 2008

Мне очень нравится функция Поддерживать актуальность удаленного каталога в Winscp . К сожалению, я не могу найти ничего более простого в использовании в OS X или Linux. Я знаю, что то же самое можно теоретически выполнить, используя changefiles или rsync , но я всегда находил учебники для обоих инструментов отсутствующими и / или противоречивыми ,

Мне просто нужен инструмент, который работает в OSX или Linux и поддерживает синхронизацию (зеркальное отображение) удаленного каталога с локальным каталогом, пока я вносю изменения в локальный каталог.


Обновление

Просматривая решения, я вижу пару, которая решает общую проблему синхронизации удаленного каталога с локальным каталогом вручную . Я знаю, что могу установить задачу cron для запуска rsync каждую минуту, и это должно быть довольно близко к реальному времени.

Это не точное решение, которое я искал, поскольку winscp делает это и многое другое: он обнаруживает изменения файлов в каталоге (пока я над ними работаю), а затем автоматически отправляет изменения на удаленный сервер. Я знаю, что это не лучшее решение (без репозитория кода), но оно позволяет мне очень быстро тестировать код на сервере во время его разработки. Кто-нибудь знает, как объединить rsync с любыми другими командами, чтобы получить эту функциональность?

Ответы [ 16 ]

1 голос
/ 16 сентября 2008

Основываясь на предложении icco о SVN, я бы на самом деле предположил, что если вы используете subversion или аналогичный для управления исходным кодом (а если нет, то, вероятно, вам следует начать), вы можете поддерживать производственную среду в актуальном состоянии, помещение команды для обновления репозитория в ловушку post-commit.

Есть много переменных в том, как бы вы хотели это сделать, но то, что я видел в работе, это то, что рабочий сайт или рабочий сайт должны быть рабочей копией, а затем после фиксации использовать ssh-ключ с Принудительная команда для входа на удаленный сайт и запуска SVN на рабочей копии. В качестве альтернативы в ловушке post-commit вы можете запустить экспорт svn на удаленной машине или локальный (в хранилище svn) svn, а затем выполнить rsync на удаленную машину.

Я бы беспокоился о вещах, которые обнаруживают изменения и толкают их, и я бы даже волновался о вещах, которые запускались каждую минуту, просто из-за условий гонки. Как вы знаете, что он не будет передавать файл в тот же момент, когда он записывается? Наткнитесь на это один или два раза, и вы потеряете все экономящее время преимущество, которое вы имели, постоянно выполняя повторную синхронизацию или подобное.

1 голос
/ 13 августа 2008

Возможно, вы решаете не ту проблему. Если вы пытаетесь редактировать файлы на удаленном компьютере, вы можете попробовать использовать что-то вроде плагина ftp для jedit. http://plugins.jedit.org/plugins/?FTP Это гарантирует, что у вас есть только одна версия файла, поэтому он никогда не будет синхронизирован.

0 голосов
/ 09 мая 2019

Если вы разрабатываете python на удаленном сервере, Pycharm может быть вам хорошим выбором. Вы можете синхронизировать удаленные файлы с локальными файлами, используя функцию удаленной разработки Pycharm. Ссылка на руководство как: https://www.jetbrains.com/help/pycharm/creating-a-remote-server-configuration.html

0 голосов
/ 27 июня 2014

Я использую этот маленький Ruby-Script:

#!/usr/bin/env ruby
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Rsyncs 2Folders
#
# watchAndSync by Mike Mitterer, 2014 <http://www.MikeMitterer.at>
# with credit to Brett Terpstra <http://brettterpstra.com>
# and Carlo Zottmann <https://github.com/carlo/haml-sass-file-watcher>
# Found link on: http://brettterpstra.com/2011/03/07/watch-for-file-changes-and-refresh-your-browser-automatically/
#

trap("SIGINT") { exit }

if ARGV.length < 2
  puts "Usage: #{$0} watch_folder sync_folder"
  puts "Example: #{$0} web keepInSync"
  exit
end

dev_extension = 'dev'
filetypes = ['css','html','htm','less','js', 'dart']

watch_folder = ARGV[0]
sync_folder = ARGV[1]

puts "Watching #{watch_folder} and subfolders for changes in project files..."
puts "Syncing with #{sync_folder}..."

while true do
  files = []
  filetypes.each {|type|
    files += Dir.glob( File.join( watch_folder, "**", "*.#{type}" ) )
  }
  new_hash = files.collect {|f| [ f, File.stat(f).mtime.to_i ] }
  hash ||= new_hash
  diff_hash = new_hash - hash

  unless diff_hash.empty?
    hash = new_hash

    diff_hash.each do |df|
      puts "Detected change in #{df[0]}, syncing..."
      system("rsync -avzh #{watch_folder} #{sync_folder}")
    end
  end

  sleep 1
end

Адаптируйте его под свои нужды!

0 голосов
/ 21 января 2013

Ну, у меня была такая же проблема, и возможно использовать их вместе: rsync, SSH Passwordless Login, Watchdog (утилита синхронизации Python) и Terminal Notifier (утилита уведомлений OS X, сделанная с Ruby. Не требуется, но помогает узнать, когда синхронизация закончилась).

  1. Я создал ключ для входа в систему без пароля с помощью этого урока из Dreamhost wiki: http://cl.ly/MIw5

    1,1. Когда вы закончите, проверьте, все ли в порядке ... если вы не можете войти в систему без пароля, возможно, вам стоит попробовать afp mount. Dreamhost (там, где находится мой сайт) не разрешает монтирование afp, но разрешает вход без пароля. В терминале введите:

    ssh username@host.com Вы должны войти в систему без ввода пароля: P

  2. Я установил Уведомление терминала со страницы Github: http://cl.ly/MJ5x

    2,1. Я использовал команду установщика Gem. В Терминале введите:

    gem install terminal-notifier

    2,3. Проверьте, работает ли уведомление. В Терминале введите:

    terminal-notifier -message "Starting sync"

  3. Создайте скрипт sh для проверки уведомления rsync +. Сохраните его где угодно, с именем, которое вам нравится. В этом примере я назову его ~ / Scripts / sync.sh Я использовал расширение ".sh, но я не знаю, нужно ли оно.

    #!/bin/bash terminal-notifier -message "Starting sync" rsync -azP ~/Sites/folder/ user@host.com:site_folder/ terminal-notifier -message "Sync has finished"

    3,1. Не забудьте дать разрешение на выполнение этого скрипта sh. В Терминале введите:

    sudo chmod 777 ~/Scripts/sync.sh 3.2. Запустите сценарий и убедитесь, что сообщения отображаются правильно и rsync фактически синхронизирует вашу локальную папку с удаленной папкой.

  4. Наконец, я скачал и установил Watchdog со страницы Github: http://cl.ly/MJfb

    4,1. Во-первых, я установил зависимость libyaml с помощью Brew (есть много полезного, как установить Brew - как «aptitude» для OS X). В Терминале введите:

    brew install libyaml

    4,2. Затем я использовал команду «easy_install». Перейдите в папку Watchdog и введите в Терминале:

    easy_install watchdog

  5. Теперь все установлено! Перейдите в папку, которую вы хотите синхронизировать , , измените этот код в соответствии со своими потребностями и введите в Терминале:

      watchmedo shell-command
          --patterns="*.php;*.txt;*.js;*.css" \
          --recursive \
          --command='~/Scripts/Sync.sh' \
          .
    

    Это должно быть ИМЕННО таким образом, с косой чертой и разрывами строк, поэтому вам придется скопировать эти строки в текстовый редактор, изменить скрипт, вставить в терминал и нажать return.

    Я пытался без разрывов строки, и это не работает!

    На моем Mac я всегда получаю сообщение об ошибке, но оно, похоже, ни на что не влияет:

    /Library/Python/2.7/site-packages/argh-0.22.0-py2.7.egg/argh/completion.py:84: UserWarning: Bash completion not available. Install argcomplete.

    Теперь внесли некоторые изменения в файл внутри папки и наблюдайте за магией!

0 голосов
/ 18 августа 2008

Вы также можете использовать Fetch в качестве SFTP-клиента, а затем редактировать файлы непосредственно на сервере. Существуют также параметры SSHFS (монтирование папки ssh в качестве тома). Это соответствует тому, что сказали стимулы - вы уверены, что хотите синхронизировать материал или просто хотите редактировать файлы на сервере?

OS X имеет собственную систему уведомлений о файлах - это то, на чем основан Spotlight. Я не слышал ни о какой программе, которая использует это для синхронизации, но это, конечно, возможно.

Я лично использую RCS для такого типа вещей: - хотя у него есть ручной аспект, маловероятно, что я захочу что-то перенести даже на тестовый сервер с моей машины разработки без предварительного тестирования. И если я работаю на сервере разработки, я использую один из вариантов, приведенных выше.

...